سؤال

وأنا أفكر في تصميم مخطط قاعدة بيانات مشابهة لما يلي:

Person (
  PersonID int primary key,
  PrimaryAddressID int not null,
  ...
)

Address (
  AddressID int primary key,
  PersonID int not null,
  ...
)

وPerson.PrimaryAddressID، وسوف يكون Address.PersonID مفاتيح خارجية إلى الجداول المقابلة.

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

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

المحلول

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

في مواجهة ذلك، وهذا الادعاء يبدو جذابة SO. ومع ذلك، فمن propostrous تماما.

وهذا هو نوع شائع جدا من المشكلة أن البائعين SQL DBMS كانت تحاول مهاجمة لربما عقود بالفعل.

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

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

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

نصائح أخرى

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

وهذا هو مثال ممتاز للكثير لكثير العلاقة. لحل أنه يجب أن يكون الجدول PERSON_ADDRESS المتوسط. وبعبارة أخرى؛

PERSON table
person_id (PK)

ADDRESS table
address_id (PK)

PERSON_ADDRESS
person_id (FK) <= PERSON
address_id (FK) <= ADDRESS
is_primary (BOOLEAN - Y/N)

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

ووFK الثاني (PersonId من العناوين لشخص) هي ضيقة للغاية، IMHO. هل يشير إلى أن عنوان واحد يمكن أن يكون سوى شخص واحد؟

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

وأنا أعلم أنني سوف ربما يصلب أو أيا كان، ولكن هنا يذهب ...

ولقد فعلت ذلك من هذا القبيل لبلادي "خاصة للغاية الخاصة بها فريدة من نوعها وغير القياسية" ضرورة العمل (= (الله أنا بدأت ليبدو وكأنه SQL DDL حتى عندما أتكلم).

وإليك exaxmple:

CREATE TABLE IF NOT EXISTS PERSON(
    ID INT, 
    CONSTRAINT PRIMARY KEY (ID), 
    ADDRESS_ID INT NOT NULL DEFAULT 1, 
    DESCRIPTION VARCHAR(255), 
    CONSTRAINT PERSON_UQ UNIQUE KEY (ADDRESS_ID, ...));

INSERT INTO PERSON(ID, DESCRIPTION) 
    VALUES (1, 'GOVERNMENT');

CREATE TABLE IF NOT EXISTS ADDRESS(
    ID INT, 
    CONSTRAINT PRIMARY KEY (ID), 
    PERSON_ID INT NOT NULL DEFAULT 1, 
    DESCRIPTION VARCHAR(255), 
    CONSTRAINT ADDRESS_UQ UNIQUE KEY (PERSON_ID, ...), 
    CONSTRAINT ADDRESS_PERSON_FK FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID));

INSERT INTO ADDRESS(ID, DESCRIPTION) 
    VALUES (1, 'ABANDONED HOUSE AT THIS ADDRESS');

ALTER TABLE PERSON ADD CONSTRAINT PERSON_ADDRESS_FK FOREIGN KEY (ADDRESS_ID) REFERENCES ADDRESS(ID);

<... الحياة تستمر ... إذا كنت توفير والعنوان أو ليس لشخص والعكس بالعكس>

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

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