رغبات متضاربة في تصميم قاعدة البيانات ، مع الحقول اثنين من وظائف مماثلة

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

سؤال

حسنا, لذلك أنا جعل الطاولة الآن "عناصر مربع".

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

صندوق البند قد تكون معيبة:إذا كان هو العلم سيتم تعيين في مربع عنصر صف (IsDefective) و الصندوق البند سوف يتم وضعها في "العوائد" مربع (مع العناصر الأخرى إلى أن عاد إلى البائع).وإلا مربع البند في نهاية المطاف سوف توضع في "الشحن" مربع (مع غيرها من البنود التي سيتم شحنها).(علما بأن الشحن و عوائد صناديق الجداول الخاصة بهم:ليس هناك مشترك واحد الجدول لجميع صناديق...على الرغم ربما يجب أن تنظر في القيام بذلك إذا كان ذلك ممكنا كما الإحتمال الثالث؟)

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

حدسي يقول لي يجب أن يكون حقل منفصل لكل علاقة ممكنة ، حتى لو كان واحد فقط من العلاقات يمكن أن يحدث في أي وقت من الأوقات ، والتي من شأنها أن تجعل المخطط مربع العناصر تبدو مثل:

BoxItemID الوصف IsDefective ShippingBoxID ReturnBoxID الخ...

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

BoxItemID الوصف IsDefective BoxID الخ...

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

لقد وضعت لكم قاعدة بيانات معلمو ستاكوفيرفلوو.ماذا ستفعل في هذه الحالة ؟

تحرير:شكرا للجميع على المدخلات الخاصة بك!انها قدمت لي الكثير من التفكير.على واحد, انا ذاهب الى استخدام ORM المرة القادمة البدء في مثل هذا المشروع.=) لمدة سنتين ، وبما أنني لست الآن سوف لدغة أربعة بايت و استخدام اثنين من المجالات.

شكرا للجميع مرة أخرى!

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

المحلول

أنا مع ذهاني السم mattlant.

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

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

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

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

مثال سريع:القيام الانضمام بين جدولين حيث إذا كنت ترغب في الانضمام على أساس إذا كان isDefective العلم هو مجموعة سوف يكون الألم.أن تكون قادرة على مجرد استخدام واحد من اثنين من الأعمدة وحده هو على الارجح ما يكفي من المتاعب قد حفظ, على الأقل بالنسبة لي.

نصائح أخرى

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

كنت استخدم ما السبات المكالمات جدول لكل فئة فرعية, لذا DB سوف تصل الرياح مع 3 طاولات مربعات: Box, ShippingBox, ، ReturnBox.FK في BoxItem من شأنه أن يشير إلى Box.

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

ماذا عن هذا ؟

BoxItem:
BoxItemID, Description, IsDefective

Box:
BoxID, Description

BoxItemMap:
BoxID, BoxItemID, BoxItemType

ثم هل يمكن أن يكون BoxItemType يكون التعداد أو عدد صحيح حيث يمكنك تحديد الثوابت في التطبيق الخاص بك مثل "العودة" أو "الشحن" كنوع من الجزاء.

توافق حول الأشكال المناقشة أعلاه ، على الرغم من أنها يمكن أن تستخدم بشكل سيئ ، فإنه لا يزال حلا قابلا للتطبيق.

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

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

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

تقريبا كل ORM دعم هذه الاستراتيجية.

كنت أذهب مع واحد فقط BoxItems الجدول مع IsDefective, ShippingBoxID الشحن-مربع-المجالات ذات الصلة ، ReturnBoxID و عودة-مربع-المجالات ذات الصلة.بعض الحقول تكون دائما فارغة لكل سجل.

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

ربما كنت اذهب مع:

BoxTable:
box_id, box_descrip, box_status_id ...
     1, Lovely Box, 1
     2, Borked box, 2
     3, Ugly Box, 3
     4, Flammable Box, 4

       BoxStatus:
       box_status_id, box_status_name, box_type_id, ....
                   1,Shippable, 1
                   2,Return, 2
                   3,Ugly, 2
                   4,Dangerous,3

                BoxType:
                box_type_id, box_type_name, ...
                          1, Shipping box, ...
                          2, Return box, ....
                          3, Hazmat box, ...

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

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