2016-08-02 82 views
1

我正在設計一個數據庫(在這裏簡化)來存放零件。每個部分都有其獨特的PartID。我們可以將部件儲存在不同的容器:將數據鏈接到數據庫中的多個實體

  • 環保袋
  • 托盤

重要的是,我們對每個容器的具體不同的信息:

  • 包: ID,材質類型,卷,手柄類型
  • 盒: ID,高度,寬度,長度
  • 托盤: ID,dateCreated會,NumberOfTimesUsed,顏色

我的問題:什麼是零件鏈接到的最好辦法這些多個容器實體?

在我看來,最簡單的方法是在Part表中創建ContainerType和ContainerID列。我很猶豫,因爲你基本上違反了具有非強制外鍵的列到多個表的參照完整性,因爲它是非法的。

我們可以用一個容器的所有可能屬性製作一個大容器表,但這看起來也很麻煩。

任何幫助或指導將不勝感激!

+0

個人而言,我會創建一個'container'表中的列'ID,ContainerType,MaterialType,音量,HandleType,高度,寬度,長度,dateCreated會,NumberOfTimesUsed,'和'Color'。你必須一噸NULL值的,但它將使加盟這麼容易,你才能避免部分表重複了大量的數據。你只需加入一個身份證號碼。 –

回答

1

這是一個在MySQL中沒有很好答案的問題。有幾種方法,每種方法都有優點和缺點。

選項#1 - 滿桌子的空值

正如評論所說,一個containers表中,將有所有列,其中不乏NULL,因爲他們將不相關的3容器2類型。 在SELECTJOIN中使用這樣的表格非常容易,但在這種情況下,數據庫無法幫助您驗證數據。您可以輕鬆地插入長度不足的包或沒有包的包,並且數據庫無法執行。

選項#2 - 移動問題的連接表

在這種方法中,你是從儲存容器,該儲存部件位置的表的表移動的問題。

有3個獨立的容器表:

  • 托盤

而對於部分連接到容器的一個表:

  • parts_to_containers

與列:

  • PART_ID
  • CONTAINER_TYPE
  • CONTAINER_ID

此選項是更好,如果你獨立,經常處理集裝箱的庫存。它與集裝箱你的工作很輕鬆,並把與部件的集裝箱安置工作問題的一部分。

您仍然可以寫3個LEFT JOIN s表示將讓你對每個零件的集裝箱信息的查詢。

一件事

如果你希望有更多類型的容器,沒有以上將是易於擴展。如果再加上越來越多的容器類型,你可能需要一個完全不同的方法,所有共同容器字段是一個主containers表,和所有其他容器屬性處於container_attributescontainer_idattribute_nameattribute_value。一屬性將是容器類型,其他人將顏色,寬度,體積等

這是爲與各種隨時間變化的不同attrobutes的對象非常靈活的模型。

+0

你不應該感謝的人的意見,但我還是要去這樣做,因爲這個答案是偉大的。謝謝。 – user1904766

0

表中一對多關係的經驗法則是:關係單邊的主鍵充當關係多方的外鍵,以保持參照完整性。

創建一個名爲containers的表,主鍵列爲containerid等欄目,如containernamecontainercreatedOncontainerlastOpenedOn。主鍵container。來自表containerid作爲名爲parts的外鍵列添加到您的零件表中。 container_id

+0

Yikes!也許我應該指定更好,但這是一對多的關係。許多零件可以放在一個容器中,而我只有一個零件表。 – user1904766