ما هو أفضل تصميم لقاعدة البيانات:المزيد من الجداول أو المزيد من الأعمدة؟[مغلق]

StackOverflow https://stackoverflow.com/questions/59482

سؤال

أصر أحد زملاء العمل السابقين على أن قاعدة البيانات التي تحتوي على عدد أكبر من الجداول مع عدد أقل من الأعمدة أفضل من قاعدة البيانات التي تحتوي على جداول أقل مع عدد أكبر من الأعمدة لكل منها.على سبيل المثال، بدلاً من جدول العملاء الذي يحتوي على الاسم والعنوان والمدينة والولاية والرمز البريدي وما إلى ذلك.الأعمدة، سيكون لديك جدول أسماء، وجدول عناوين، وجدول مدينة، وما إلى ذلك.

وقال إن هذا التصميم كان أكثر كفاءة ومرونة.ربما تكون أكثر مرونة، لكنني لست مؤهلاً للتعليق على كفاءتها.وحتى لو كان أكثر كفاءة، أعتقد أن هذه المكاسب قد يفوقها التعقيد الإضافي.

لذا، هل هناك أي فوائد كبيرة لمزيد من الجداول التي تحتوي على عدد أقل من الأعمدة مقارنة بالجداول الأقل التي تحتوي على المزيد من الأعمدة؟

هل كانت مفيدة؟

المحلول

لدي بعض القواعد الأساسية البسيطة إلى حد ما التي أتبعها عند تصميم قواعد البيانات، والتي أعتقد أنه يمكن استخدامها للمساعدة في اتخاذ قرارات مثل هذه....

  1. تفضل التطبيع.يعد إلغاء التسوية شكلاً من أشكال التحسين، مع جميع المفاضلات المطلوبة، وعلى هذا النحو يجب التعامل معه من خلال ياجني سلوك.
  2. تأكد من أن رمز العميل الذي يشير إلى قاعدة البيانات منفصل بشكل كافٍ عن المخطط بحيث لا تتطلب إعادة صياغته إعادة تصميم كبيرة للعميل (العملاء).
  3. لا تخف من إلغاء التسوية عندما توفر فائدة واضحة للأداء أو تعقيد الاستعلام.
  4. استخدم طرق العرض أو الجداول النهائية لتنفيذ إلغاء التسوية بدلاً من إلغاء تسوية جوهر المخطط، عندما يسمح حجم البيانات وسيناريوهات الاستخدام بذلك.

والنتيجة المعتادة لهذه القواعد هي أن التصميم الأولي سيفضل الجداول على الأعمدة، مع التركيز على القضاء على التكرار.مع تقدم المشروع وتحديد نقاط عدم التطبيع، سوف يتطور الهيكل العام نحو توازن يتنازل عن التكرار المحدود وانتشار الأعمدة مقابل فوائد قيمة أخرى.

نصائح أخرى

أود أن أزعم لصالح المزيد من الجداول، ولكن فقط إلى حد معين.باستخدام المثال الخاص بك، إذا قمت بفصل معلومات المستخدم إلى جدولين، على سبيل المثال USERS وADDRESS، فإن هذا يمنحك المرونة للحصول على عناوين متعددة لكل مستخدم.أحد التطبيقات الواضحة لهذا هو المستخدم الذي لديه عناوين منفصلة للفوترة والشحن.

الحجة المؤيدة لوجود جدول CITY منفصل هي أنه يتعين عليك فقط تخزين اسم كل مدينة مرة واحدة، ثم الرجوع إليه عندما تحتاج إليه.وهذا يقلل من الازدواجية، ولكن في هذا المثال أعتقد أنه مبالغة.قد يكون ذلك أكثر كفاءة في استخدام المساحة، ولكنك ستدفع الثمن في عمليات الانضمام عندما تقوم بتحديد البيانات من قاعدة البيانات الخاصة بك.

لا يبدو الأمر وكأنه سؤال حول الجداول/الأعمدة، بل حول التطبيع.في بعض الحالات يكون على درجة عالية من تطبيع ("المزيد من الجداول" في هذه الحالة) أمر جيد ونظيف، ولكنه يتطلب عادةً عددًا كبيرًا من عمليات JOIN للحصول على النتائج ذات الصلة.ومع وجود مجموعة بيانات كبيرة بما فيه الكفاية، يمكن أن يؤدي ذلك إلى إعاقة الأداء.

كتب جيف القليل عن ذلك فيما يتعلق بتصميم StackOverflow.راجع أيضًا المنشور الذي يرتبط به Jeff بواسطة يجرؤ أوباسانجو.

يعد التصميم المطبيع بالكامل (أي "المزيد من الجداول") أكثر مرونة وأسهل في الصيانة ويتجنب تكرار البيانات، مما يعني أن تنفيذ تكامل البيانات سيكون أسهل كثيرًا.

هذه أسباب قوية للتطبيع.سأختار التطبيع أولاً، وبعد ذلك فقط إزالة التطبيع محدد الجداول بعد لقد رأيت أن الأداء أصبح مشكلة.

تجربتي هي أنه في العالم الحقيقي، لن تصل إلى النقطة التي يكون فيها إلغاء التسوية ضروريًا، حتى مع مجموعات البيانات الكبيرة جدًا.

ذلك يعتمد على نكهة قاعدة البيانات الخاصة بك.على سبيل المثال، يميل MS SQL Server إلى تفضيل الجداول الأضيق.وهذا أيضًا هو النهج الأكثر "تطبيعًا".قد تفضل المحركات الأخرى العكس.تميل الحواسيب المركزية إلى الوقوع في هذه الفئة.

يجب أن يتضمن كل جدول فقط الأعمدة التي تتعلق بالكيان الذي تم تعريفه بشكل فريد بواسطة المفتاح الأساسي.إذا كانت جميع الأعمدة الموجودة في قاعدة البيانات كلها سمات لنفس الكيان، فستحتاج فقط إلى جدول واحد يحتوي على جميع الأعمدة.

إذا كان أي من الأعمدة قد يكون فارغًا، فستحتاج إلى وضع كل عمود فارغ في الجدول الخاص به باستخدام مفتاح خارجي للجدول الرئيسي من أجل تطبيعه.يعد هذا سيناريو شائعًا، لذا للحصول على تصميم أكثر وضوحًا، فمن المحتمل أن تقوم بإضافة جداول أكثر من الأعمدة إلى الجداول الموجودة.بالإضافة إلى ذلك، من خلال إضافة هذه السمات الاختيارية إلى جدولها الخاص، لن تحتاج بعد الآن إلى السماح بالقيم الخالية وستتجنب عددًا كبيرًا من المشكلات المتعلقة بالقيم الخالية.

تعد قاعدة البيانات متعددة الجداول أكثر مرونة إذا كانت أي من هذه العلاقات من رأس إلى واحد قد تصبح واحدة لكثير أو متعددة لكثير في المستقبل.على سبيل المثال، إذا كنت بحاجة إلى تخزين عناوين متعددة لبعض العملاء، فسيكون الأمر أسهل كثيرًا إذا كان لديك جدول عملاء وجدول عناوين.لا أستطيع حقًا رؤية موقف قد تحتاج فيه إلى تكرار بعض أجزاء العنوان دون أجزاء أخرى، لذا قد تكون الجداول المنفصلة للعنوان والمدينة والولاية والرمز البريدي أعلى قليلاً.

مثل كل شيء آخر:هذا يعتمد.

لا توجد قاعدة صارمة وسريعة فيما يتعلق بعدد الأعمدة مقابل عدد الجدول.

إذا كان عملاؤك بحاجة إلى عناوين متعددة، فمن المنطقي وجود جدول منفصل لذلك.إذا كان لديك سبب وجيه حقًا لتطبيع عمود المدينة في الجدول الخاص به، فيمكن أن يتم ذلك أيضًا، لكنني لم أر ذلك من قبل لأنه حقل ذو شكل حر (عادة).

يعتبر التصميم الطبيعي الثقيل للطاولة فعالاً من حيث المساحة ويبدو "جيدًا للكتب المدرسية" ولكنه قد يكون معقدًا للغاية.يبدو الأمر رائعًا حتى يتعين عليك إجراء 12 عملية انضمام للحصول على اسم العميل وعنوانه.هذه التصاميم ليست كذلك تلقائيا رائع من حيث الأداء الذي يهم أكثر:الاستعلامات.

تجنب التعقيد إن أمكن.على سبيل المثال، إذا كان لدى العميل عنوانين فقط (ليس كثيرًا بشكل عشوائي)، فقد يكون من المنطقي الاحتفاظ بهم جميعًا في جدول واحد (معرف العميل، والاسم، وShipToAddress، وBillingAddress، وShipToCity، وBillingCity، وما إلى ذلك).

وهنا وظيفة جيف حول هذا الموضوع.

هناك مزايا لوجود جداول تحتوي على عدد أقل من الأعمدة، ولكنك تحتاج أيضًا إلى إلقاء نظرة على السيناريو أعلاه والإجابة على هذه الأسئلة:

هل سيسمح للعميل بالحصول على أكثر من عنوان واحد؟إذا لم يكن الأمر كذلك، فليس من الضروري وجود جدول منفصل للعنوان.إذا كان الأمر كذلك، يصبح الجدول المنفصل مفيدًا لأنه يمكنك بسهولة إضافة المزيد من العناوين حسب الحاجة في المستقبل، حيث يصبح من الصعب إضافة المزيد من الأعمدة إلى الجدول.

سأعتبر التطبيع كخطوة أولى، لذلك سيكون من الأفضل وضع المدن والمقاطعات والولايات والبلدان كأعمدة منفصلة...تتيح لك قوة لغة SQL، جنبًا إلى جنب مع نظام إدارة قواعد البيانات (DBMS) اليوم، تجميع بياناتك لاحقًا إذا كنت بحاجة إلى عرضها في طريقة عرض أخرى غير طبيعية.

أثناء تطوير النظام، قد تفكر في "إلغاء تسوية" جزء ما إذا كنت ترى ذلك بمثابة تحسين.

أعتقد أن التوازن في محله في هذه الحالة.إذا كان من المنطقي وضع عمود في الجدول، فقم بوضعه في الجدول، وإذا لم يكن الأمر كذلك، فلا تفعل ذلك.من المؤكد أن أسلوب زملائك في العمل سيساعد في تطبيع قاعدة البيانات، ولكن قد لا يكون ذلك مفيدًا جدًا إذا كان عليك ضم 50 جدولًا معًا للحصول على المعلومات التي تحتاجها.

أعتقد أن إجابتي ستكون، استخدم أفضل حكم لديك.

هناك العديد من الجوانب لذلك، ولكن من منظور كفاءة التطبيق، يمكن أن تكون جداول mote أكثر كفاءة في بعض الأحيان.إذا كان لديك عدد قليل من الجداول التي تحتوي على مجموعة من الأعمدة في كل مرة تقوم فيها قاعدة البيانات بإجراء عملية ما، يكون لديها فرصة لإجراء قفل، فسيتم عدم إتاحة المزيد من البيانات طوال مدة القفل.إذا تم تصعيد عمليات التأمين إلى الصفحة والجداول (نأمل ألا تكون الجداول :)) يمكنك أن ترى كيف يمكن أن يؤدي ذلك إلى إبطاء النظام.

همم.

أعتقد أنه غسيل ويعتمد على نموذج التصميم الخاص بك.بالتأكيد قم بتحليل الكيانات التي تحتوي على أكثر من بضعة حقول في جدولها الخاص، أو الكيانات التي من المحتمل أن يتغير تركيبها مع تغير متطلبات التطبيق الخاص بك (على سبيل المثال - سأستبعد العنوان على أي حال، نظرًا لأنه يحتوي على العديد من الحقول، لكنني 'د خصوصاً افعل ذلك إذا كنت تعتقد أن هناك أي احتمال أنك ستحتاج إلى التعامل مع عناوين الدول الأجنبية، والتي يمكن أن تكون ذات شكل مختلف.الشيء نفسه مع أرقام الهواتف).

ومع ذلك، عندما تنتهي من العمل، راقب الأداء.إذا قمت بتدوير كيان يتطلب منك إجراء عمليات ربط كبيرة ومكلفة، فقد يصبح قرار التصميم أفضل لإعادة تدوير هذا الجدول مرة أخرى إلى الجدول الأصلي.

هناك فوائد ضخمة ل الاستعلامات باستخدام أقل عدد ممكن من الأعمدة.لكن الجدول نفسه يمكن أن يحتوي على عدد كبير. جيف ويقول شيئا عن هذا أيضا.

بشكل أساسي، تأكد من أنك لا تطلب أكثر مما تحتاجه عند إجراء استعلام - يرتبط أداء الاستعلامات بشكل مباشر بعدد الأعمدة التي تطلبها.

أعتقد أنه يتعين عليك إلقاء نظرة على نوع البيانات التي تقوم بتخزينها قبل اتخاذ هذا القرار.يعد وجود جدول عناوين أمرًا رائعًا، ولكن فقط إذا كانت احتمالية مشاركة عدة أشخاص لنفس العنوان عالية.إذا كان لكل شخص عناوين مختلفة، فإن الاحتفاظ بتلك البيانات في جدول مختلف يؤدي فقط إلى عمليات ربط غير ضرورية.

لا أرى فائدة من وجود جدول مدينة إلا إذا كانت المدن في حد ذاتها كيانات تهتم بها في طلبك.أو إذا كنت تريد تحديد عدد المدن المتاحة لمستخدميك.

خلاصة القول هي أن مثل هذه القرارات يجب أن تأخذ التطبيق نفسه بعين الاعتبار قبل البدء في التصوير لتحقيق الكفاءة.المنظمة البحرية الدولية.

عند تصميم قاعدة بياناتك، يجب أن تكون أقرب ما يمكن من معنى البيانات وليس من احتياجات تطبيقك!

يجب أن يستمر التصميم الجيد لقاعدة البيانات لأكثر من 20 عامًا دون تغيير.

يمكن أن يكون للعميل عناوين متعددة، هذا هو الواقع.إذا قررت أن تطبيقك يقتصر على عنوان واحد للإصدار الأول، فالأمر يتعلق بتصميم تطبيقك وليس بالبيانات!

من الأفضل أن يكون لديك جدول متعدد بدلاً من أعمدة متعددة وأن تستخدم طريقة العرض إذا كنت تريد تبسيط استعلامك.

في معظم الأوقات، ستواجه مشكلة في الأداء مع قاعدة بيانات، يتعلق الأمر بأداء الشبكة (استعلام متسلسل بنتيجة صف واحد، وجلب عمود لا تحتاجه، وما إلى ذلك) وليس يتعلق بتعقيد استعلامك.

أولاً، قم بتطبيع الجداول الخاصة بك.ويضمن ذلك تجنب البيانات الزائدة عن الحاجة، مما يمنحك صفوفًا أقل من البيانات لفحصها، مما يؤدي إلى تحسين استعلاماتك.بعد ذلك، إذا واجهت نقطة تتسبب فيها الجداول التي تمت تسويتها والتي تنضم إليها في استغراق الاستعلام وقتًا طويلاً للمعالجة (عبارة ربط باهظة الثمن)، فقم بإلغاء التسوية حيثما يكون ذلك مناسبًا.

من الجيد أن نرى الكثير من الإجابات الملهمة والمبنية على أساس جيد.

جوابي سيكون (للأسف):هذا يعتمد.

حالتان:* إذا قمت بإنشاء نموذج بيانات ليتم استخدامه لسنوات عديدة، وبالتالي ربما يتعين عليه أن يتقن العديد من التغييرات المستقبلية:اذهب لمزيد من الجداول وصفوف أقل وتطبيع صارم جدًا.* في حالات أخرى يمكنك الاختيار بين جداول أكثر - صفوف أقل أو جداول أقل - صفوف أكثر.خاصة بالنسبة للأشخاص الجدد نسبيًا في هذا الموضوع، يمكن أن يكون هذا النهج الأخير أكثر بديهية وسهل الفهم.

وينطبق الشيء نفسه على الاختيار بين النهج الموجه للكائنات والخيارات الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top