سؤال

يجب أن تواريخ لقاعدة بيانات زمنية مخزنة في طاولات واحدة أو 2؟ إذا لم ينتهك هذا التطبيع؟

PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT

تشير أعمدة Date1 و Date2 إلى أن info1 و Infoy2 صحيحة للفترة بين Date1 و Date2. إذا كان التاريخ <اليوم، يتم إهمال الحقائق ولا ينبغي أن تظهر بعد الآن في واجهة المستخدم ولكن لا ينبغي حذفها للغرض التاريخي. على سبيل المثال INFO11 ويتم الآن إهمال Info21.

يجب أن أقسم هذا الجدول؟ يجب علي تخزين الدولة (إهمالها أو تيارها) في الجدول؟

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

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

المحلول

"أريد أن أعرف أي تصميم ينتهك قواعد التطبيع"

يعتمد على مجموعة من قواعد التطبيع التي تريد الذهاب إليها.

والانتهاك الأول والأكثر احتمالا للنماذج العادية، وفي كتاب التاريخ إنه انتهاك أول NF., ، هل تواريخ تنتهي في الصفوف التي تحمل معلومات "الحالية" (إجراء تجريد إمكانية معلومات مؤرخة في المستقبل): أنت تنتهك 1NF إذا قمت بإجراء هذه السمة خالية.

انتهاكات BCNF. قد يحدث بوضوح نتيجة اختيارك للمفاتيح (كما هو الحال في تصاميم قاعدة بيانات Nontemporal أيضا - الجانب الزمني لا فرق هنا). WRT "اختيار المفاتيح": إذا كنت تستخدم مواعيد بدء التشغيل والتنتهي المنفصلة (و SQL Trank من أوراقك لا خيار آخر)، فمن المحتمل أن تعلن مفتاحين: واحد يتضمن تاريخ البدء، والآخر يتضمن تاريخ الانتهاء.

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

نصائح أخرى

التطبيع هو مفهوم قاعدة بيانات العلائقية - لا ينطبق أيضا لقواعد البيانات الزمنية. لا يعني أنه لا يمكنك تخزين البيانات الزمنية في قاعدة بيانات علنية. أنت بالتأكيد يمكن.

ولكن إذا كنت تسير في تصميم قاعدة البيانات الزمنية، فإن مفاهيم التطبيع الزمني تنطبق بدلا من التطبيع العلائقي.

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

"الحقائق تنخفض ويجب ألا تظهر الآن في واجهة المستخدم"

إذا كانت الحقيقة لا "يجب أن تظهر في واجهة المستخدم" بعد الآن، فلا يحتاج إلى أن تكون في قاعدة البيانات بعد الآن. الحفاظ على هذه الحقائق هناك تحقق شيئا واحدا فقط: تدهور الأداء العام لجميع البقية.

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

(PS) أن أقول أن التصميم الخاص بك جيد، لا يعني أنك لن ترشح أي مشاكل. SQL غير مناسب للغاية للتعامل مع هذا النوع من المعلومات بأناقة. "البيانات الزمنية والنموذج العلائقية" هي علاج ممتاز للموضوع. كتاب آخر، واحد من Snodgrass، وغالبا ما يشيد كثيرا، وإن لم يكن من قبل لي. هذا هو شيء من كتاب الطبخ مع وصفات للتعامل مع هذه المشكلات في SQL، كما ثبت من قبل المحادثة التالية على هذا الكتاب:

(س) "لماذا قرأت ذلك؟" (أ) "لأن الزناد الذي طلبته هو في الصفحة 135."

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