سؤال

هل هناك أي طريقة لاستخدام الميراث في قاعدة البيانات (على وجه التحديد في SQL Server 2005)؟

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

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

المحلول

لا يوجد شيء مثل الوراثة بين الجداول في SQL Server 2005، وكما لاحظ الآخرون، يمكنك الحصول على مساعدة في إضافة الأعمدة الضرورية إلى الجداول عند إنشائها، ولكنها لن تكون وراثة كما تفعل يعرف.

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

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

الحد الأدنى:عمل يدوي.

نصائح أخرى

PostgreSQL لديه هذه الميزة.ما عليك سوى إضافة هذا إلى نهاية تعريف الجدول الخاص بك:

INHERITS FROM (tablename[, othertable...])

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

بقدر ما أعرف، هذه ليست ميزة تستخدم في كثير من الأحيان.

يمكنك إنشاء قالب في جزء القالب في Management Studio.ثم استخدم هذا القالب في كل مرة تريد فيها إنشاء جدول جديد.

إذا فشل ذلك، يمكنك تخزين الحقلين CreatedOn وCreatedBy في جدول تتبع التدقيق الذي يشير إلى الجدول والمعرف الأصليين.

إذا تعذر ذلك، قم بذلك يدويًا.

يمكنك استخدام أداة نمذجة البيانات مثل ER/Studio أو ERWin.تحتوي كلتا الأداتين على أعمدة مجال حيث يمكنك تحديد قالب عمود يمكنك تطبيقه على أي جدول.عندما يتغير المجال، تتغير الأعمدة المرتبطة به أيضًا.يحتوي ER/Studio أيضًا على قوالب تشغيل يمكنك إنشاؤها وتطبيقها على أي جدول.هذه هي الطريقة التي نقوم بها بتحديث أعمدة LastUpdatedBy وLastUpdatedDate دون الحاجة إلى إنشاء وصيانة مئات البرامج النصية للتشغيل.

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

أتمنى أن يساعدك هذا.

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

إذا كنت تستخدم المعرفات الفريدة العمومية (GUIDs)، فيمكنك إنشاء جدول CreateHistory باستخدام الأعمدة GUID وCreatedOn وCreatedBy.لملء الجدول، لا يزال يتعين عليك إنشاء مشغل لكل جدول أو التعامل معه في منطق التطبيق.

أنت لا تريد استخدام الميراث للقيام بذلك!عندما يرث الجدول B وC وD من الجدول A، فهذا يعني أن الاستعلام عن الجدول A سيعطيك سجلات من B وC وD.الآن فكر...

حذف من أ؛

بدلاً من الميراث، استخدم LIKE بدلاً من ذلك...

CREATE TABLE blah (
    blah_id     serial       PRIMARY KEY
    , something text         NOT NULL
    , LIKE template_table    INCLUDING DEFALUTS
);

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

في تعيين OR، يتم تعيين الوراثة إلى جدول أصل حيث يستخدم الجدولان الأصل والفرعي نفس المعرف

على سبيل المثال

create table Object (
    Id int NOT NULL --primary key, auto-increment
    Name varchar(32)
)
create table SubObject (
    Id int NOT NULL  --primary key and also foreign key to Object
    Description varchar(32)
)

لدى SubObject علاقة مفتاح خارجي بالكائن.عندما تقوم بإنشاء صف كائن فرعي، يجب عليك أولاً إنشاء صف كائن واستخدام المعرف في كلا الصفين

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