所以在四個表
Video_clips_att
Video_events_attributes
GD_album_attributes
GD_manipulation_att
你可以有ORDER_DETAILS或訂單外鍵。
這取決於您是否希望通過Order_details將每個屬性連接到特定產品,或者只是將訂單中的特定訂單連接到特定產品。
像
SELECT Video_clips_att.* FROM Video_clips_att INNER JOIN Order_details ON Video_clips_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT Video_events_attributes.* FROM Video_events_attributes INNER JOIN Order_details ON Video_events_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT GD_album_attributes.* FROM GD_album_attributes INNER JOIN Order_details ON GD_album_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT GD_manipulation_att.* FROM GD_manipulation_att INNER JOIN Order_details ON GD_manipulation_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
查詢將返回四個集合,每個數據集之一,屬於一個特定的順序。
現在,當你在你的應用程序中使用這些數據,你可以這樣做:
public class IOrder {
public ICollection<IOrderAttributes> OrderAttributes;
}
public class Order : IOrder {
public ICollection<VideoClipAttributes> GetAllVideoClipAttributes {
return OrderAttributes.Where(x => typeof(x) == typeof(VideoClipAttributes)).Select(x => (VideoClipAttributes)x);
}
}
public class OrderAttributes : IOrderAttributes {
//work and stuff
}
public class VideoClipAttributes : OrderAttributes
{
//more work and stuff
}
好,你的想法。
從所有這四個表中獲取數據並將其放入四種不同的類型(從相同類型繼承而來,然後將它們全部放入合理分離和抽象的好集合中)並不是太多工作。如果您希望能夠通過其各自的產品識別每個屬性對象,則應該在屬性表上使用order_detailsID外鍵。
這將工作,因爲order_details表不必將外鍵返回到屬性表,所以您不需要維護該關係的人爲層。
編輯2016年10月24日:
既然你想要一個爲了一個屬性的關係,一個明智的解決辦法是將你的四個表合併成一個:
Order_attributes{
attributesID
orderID
video_clips_typeID
employeeID
video_clip_statusID
title
date
languageID
song_choiceID
video_event_typeID
video_event_statusID
unique_name
bride_name
groom_name
other_name
album_typeID
GD_album_statusID
need_names
spreads
size_w_mm
size_h_mm
has_cover
cover_size_w_mm
cover_size_h_mm
raw_image_amount
GD_manipulation_detailID
GD_manipulation_statusID
attributes_type
}
然後,您的訂單可以有像這樣的成員:
public class IOrder {
IOrderAttributes attributes
}
要與你的數據庫接口,你可以有一個像OrderAttributes類商店,它複製秩序的架構屬性完全表,但是當你建立你的命令的單個實例,你可以做一個這樣的開關:
switch (OrderAttributesStore.AttributesType){
case 0:
return new VideoClipsAttributes(){property=value,...};
Case 1:
...
}
那怎麼這個事情的作品:https://dotnetfiddle.net/Glyhj2
您可以進一步簡化流程,但這是總體思路。
然後,您可以在訂單中爲Order_attributes添加一個外鍵並使其唯一。
[quote]「這將起作用,因爲order_details表不需要將外鍵返回到屬性表,所以您不需要維護這種關係的人工層。」 [/ quote] 但是我不希望用戶能夠按一個順序排列多個屬性......所以說這樣做可以(也應該是)一對一的關係是正確的嗎?(在訂單明細和屬性之間) 非常感謝您的詳細解答 –
@ZviTwersky - 對於一個訂單到一個屬性,您無法在多個表中實施唯一約束。既然你想要一個細節到訂單的關係,那麼在你的屬性中使用外部的訂單ID會更有意義。您可以使用觸發器過程來確保您正在插入/更新的條目不存在於其他屬性表中。或者,您可以將這四個表合併爲一個,然後使用列來標識您需要的四種類型之一,並將數據傳遞給應用程序中的相應類型。 – Nomenator