2016-10-23 28 views
1

我已經研究了被提及here如何設計一個表層次結構與不同的產品訂單參數

我仍然無法找到一個落實到一個新的數據庫設計,我創建了5種方法。提到的每一種方式都有其優點和缺點,缺點不適合我的需求。

我會簡短地解釋我需要什麼。 我公司擁有部門和每個部門都有類別(我剛上市的幾個爲例):

  1. 視頻編輯(VE) 貓1:活動 貓2:剪輯 貓3:生產

  2. 平面設計(GD) 貓1:數字專輯 貓2:照片操縱 貓3:照片潤飾

正如你所看到的,每個產品都有完全不同的屬性。

截至目前,我有一個每個部門的Excel文件,其中每個文件都有所有客戶端的選項卡(這就是我製作數據庫的原因)。

在我的網站上,每個類別都有一個爲該類別中的屬性設計的ORDER FORM。我在執行ORDERS表層次結構時遇到了麻煩。你可以在我的屏幕截圖中看到(不介意命名......我使用了「attributes」,所以你可以看到它是什麼,我將把它改爲「att」,我也只是爲測試做了一些基本的專欄)四個正確的表格就是當客戶從這些類別訂購產品時,今天的訂單表格。所以如果你仔細想想,它們應該是與ORDER_DETAIL表的一對一關係(就像我在屏幕截圖中對其中的一個做的那樣),因爲你只能按順序排列其中的一行。但我在想的一個問題是名稱「order_detailsID」不匹配,我已經瞭解到,關鍵鍵應該有相同的名稱......並且我不能命名屬性表的PK的「order_detailsID」,因爲那不是什麼它是......它是屬性。

也許我的ORDERS和ORDERS_DETAILS是錯誤的......我不知道。我需要幫助來弄清楚如何使客戶能夠訂購產品並基於此獲得合適的屬性表來填寫行。

(當然,在FK「order_detailsID」在ATT表場不被用作我不知道我是否會需要他們。)

什麼你有什麼建議?

點擊HERE可獲得較大的原始畫面質量。

enter image description here

回答

1

所以在四個表

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添加一個外鍵並使其唯一。

+1

[quote]「這將起作用,因爲order_details表不需要將外鍵返回到屬性表,所以您不需要維護這種關係的人工層。」 [/ quote] 但是我不希望用戶能夠按一個順序排列多個屬性......所以說這樣做可以(也應該是)一對一的關係是正確的嗎?(在訂單明細和屬性之間) 非常感謝您的詳細解答 –

+1

@ZviTwersky - 對於一個訂單到一個屬性,您無法在多個表中實施唯一約束。既然你想要一個細節到訂單的關係,那麼在你的屬性中使用外部的訂單ID會更有意義。您可以使用觸發器過程來確保您正在插入/更新的條目不存在於其他屬性表中。或者,您可以將這四個表合併爲一個,然後使用列來標識您需要的四種類型之一,並將數據傳遞給應用程序中的相應類型。 – Nomenator

相關問題