تصميم قاعدة البيانات لعقد معلومات الشخص التي تتغير مع مرور الوقت؟

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

سؤال

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

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

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

أساسا نود تحويل نوع العضو وخصائص الحالة إلى الخصائص الزمنية أو فعالية A-LA FOWLER (أو بعض الشيء الآخر يختلف مع مرور الوقت).

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

تحديث 2009-08-25: تم تتبعها جانبية ولن تتحدث فرصة لتجربة الحلول المقترحة حتى الآن. نأمل في القيام بذلك قريبا وسوف تختار إجابة بناء على النتائج.

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

المحلول

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

هذا بسيط إلى حد ما التنفيذ، ولن يؤثر على النظام الحالي على الإطلاق.

سأكتب هذا لك لعضوية مجانية. :)

نصائح أخرى

لا أستطيع أن أوصي بك بما يكفي لقراءة جو Celko's "SQL ل SQL Smarties - برامج SQL المتقدمة". لديه فصل كامل حول تصميم قاعدة البيانات الزمنية وكيفية (فعالة بشكل فعال) تشغيل الإسقاط الزمني والاختيار واستفسارات الانضمام الزمني. ولن أقوم به عدالة حتى محاولة شرح ما يقول في فصله في هذا المنصب.

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

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

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

هذا هو الكثير من العمل، لكنه سيدفع مع مرور الوقت.

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

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