قاعدة بيانات SQL (فايربيرد):مشكلة مع المفاتيح الخارجية

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

سؤال

بلدي قاعدة بيانات SQL (فايربيرد) لديه جدول اسمه tTransaction.أنه يحتوي على عمودين ، senderFK و receiverFK.هناك ثلاثة الجداول الأخرى ، tBufferStock, tFacility و tOutsideLocation.

المرسل أو المتلقي يمكن أن تكون إما مخزون لدينا منشأة خاصة أو موقع خارج.

مشكلتي هي أنني لا أعرف كيفية السماح senderFK أو receiverFK إشارة يمين الجدول.

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

نوربرت

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

المحلول

ما كنت تحاول القيام به لا يمكن أن يتم في SQL.لا يمكن الإشارة إلى ثلاث جداول مختلفة مع واحد FK.

ما تحتاج إلى القيام به ليكون:

  • إنشاء أعمدة إضافية senderBufferstockFK, senderFacilityFK, ، senderOutsideLocationFK
  • ربط هذه الجداول المناسبة
  • يكون الاختيار القيد (إذا كان معتمدا) أو الزناد أو آلية أخرى على الجدول الرئيسي للتأكد من فقط واحد من هؤلاء الثلاثة له قيمة في أي وقت

هذا يعني أنه في أي وقت من الأوقات ، فقط واحد من ثلاثة "fk" عمود يمكن أن يكون لها قيمة في ذلك ، ولكن كل FK العمود سيكون محدد FK إلى جدول معين.

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

YourTable.SenderFK --> Intermediary.PK
    Intermediary.SenderBufferstockFK --> tBufferstock.ID
    Intermediary.SenderFacilityFK --> tFacility.ID
    Intermediary.SenderOutsideLocationFK --> tOutsideLocation.ID

أو يمكنك مجرد قطرة FK-العلاقة, ولكن هذا بالتأكيد لا فكرة جيدة!

مارك

نصائح أخرى

وحاول المخطط التالي:

tSenderReceiver (type INT, id INT, PRIMARY KEY (type, id))

tTransaction (id INT PRIMARY KEY, senderType INT, senderId INT, receiverType INT, receiverID INT,
      FOREIGN KEY (senderType, senderID) REFERENCES tSenderReceiver,
      FOREIGN KEY (receiverType, receiverID) REFERENCES tSenderReceiver
)

tBufferStock (type INT, id INT,
      CHECK (type = 1),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

tFacility (type INT, id INT,
      CHECK (type = 2),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

tOutsideLocation (type INT, id INT,
      CHECK (type = 3),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

SQL server لا يدعم الأجنبية الرئيسية من شكل "إما هذا العمود في الجدول X أو عمود في الجدول Y".يمكنك:

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

  2. التحرك الخاص بك التكامل المرجعي من المفتاح الخارجي في الزناد ، إذا كانت مدعومة من قاعدة البيانات الخاصة بك.

ولا يمكنك استخدام 3 أعمدة للمرسل و 3 لاستقبال؟ لذلك عليك bufferSenderFK، facilitySenderFK وfacilitySenderFK. لمعاملة واحدة، 1 عمود يمكن استخدام والآخران سيكون لاغيا.

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