2012-03-21 43 views
0

我應該發出一個包含可變內容的盒子,並在數據庫中跟蹤此信息。儘管每個項目類型具有相同長度的序列號(即PK是相同的數據類型),但我的所有項目(一個框的內容)都是不同的類型並且需要不同的表來跟蹤它們各自的信息片段。我有一個Boxes表。多對多但源自多個表

所以每個項目都有一個表格(~7個表格)加上表格。我想創建一個BoxContents表。我試圖製作一個多列關係的中間表,兩列:一列用於BoxID,一列用於ItemBarcode,其中BoxID是表中PK的FK,而ItemBarcode是FK給每個PK上的PK項目表(即我試圖鏈接多個表到同一列)。毫不奇怪,這沒有奏效。我嘗試插入一個項目,並且除了其中一個ItemBarcode關係外,FK約束被違反。

如何構建我的關係以將多種類型的項目鏈接到一個表格中的一個表格?這是否合乎邏輯?你需要更多信息?

回答

1

我的第一選擇,如果ItemBarcode的值是真正獨特的,將是:

編輯:添加了所需觸發器的描述。

  • 添加觸發器以強制執行條碼唯一性。 (每個項目表上的插入/更新觸發器需要驗證所有(新分配的)條形碼不出現在其他項目表中。)
  • 在條形碼端使用一個沒有FK關係的BoxId/ItemBarcode表,但用觸發器來確保它仍然有效。 (關聯表上的插入/更新觸發器需要驗證條目表中是否存在條形碼,每個條目表上的刪除觸發器需要防止或級聯刪除關聯表中的條目。在項目表上需要更新和更改關聯表中的條形碼,最後一個可以集成到先前項目符號中的插入/更新觸發器中。)
  • 考慮使用視圖所有項目訪問公共數據ItemBarcode

我的第二個選擇是對ñ項目類型ñBoxId/ItemBarcode表。直截了當,但有點忙。它使得添加一個新的項目類型messier比它需要。

我不會使用BoxId/ItemTypeId/ItemBarcode表。它通過再次關聯ItemTypeIdItemBarcode來非規範化數據,它不允許在條形碼端使用FK,並且它仍然需要觸發器來確保完整性。

不要害怕觸發器。有一些問題可以很有效地解決。

+0

由於我之前沒有使用過觸發器,我怎麼知道要檢查哪張表來驗證插入的條形碼是否出現在正確的表格中?每個條目的條形碼都有自己的前綴我想我有一些switch語句可以解析一部分條形碼然後重定向到另一個存儲過程? – Brad 2012-03-21 14:07:30

+0

哦!我想我明白了!當我想在插入單個項目表的同時插入到彙總表中時,我不會添加到「彙總項目」中(即填充boxcontents表格) !然後這些條目總是正確的。 – Brad 2012-03-21 14:10:18

+0

@Brad - 當您將一個項目添加到一個框中時,您只關心該項目的條形碼在所有項目條形碼的「聯合」中。製作一個提供'union'的'view'可以簡化事情。觸發器可以強制執行_deferential_ integrity,也就是您自己的奇數版本的參照完整性,這樣數據就不會被破壞。 (* - 挑戰感興趣的讀者。) – HABO 2012-03-21 15:19:40

0

關係數據庫對這類問題不好。你的基本設計是正確的 - 一個協會表格之間的FKs表。

你的選擇是:

  1. 有多個列中的關聯表 - 一個用於每個項目表
  2. 合併項目數據到一個項目表

我會去選擇2

+0

我覺得像任何一種方式,我會最終與空白字段的行。如果我選擇1,那麼不是每個盒子都會有所有類型的物品。如果我選擇選項2.並非每個項目都需要相同的列才能獲得信息。空白的領域似乎不是一個好主意。特別是很多設計,對吧? – Brad 2012-03-21 00:55:56

+0

你可能更好的是在項目表中有稀疏的數據 - 它更容易管理,並且是有限的和小的行大小 – Bohemian 2012-03-21 00:58:42

+0

是的,不幸的是,但我可以經理將所有這些表合併爲一個。我想我需要在應用程序級別強制執行必需的/ N/A字段。 – Brad 2012-03-21 01:22:15

6

你需要一個類別層次結構(也稱爲類層次結構,層次亞型,繼承層次...。):

enter image description here

3 main strategies用於實現類層次結構。如果您選擇「一張桌子上的所有課程」或「每張桌子的課程」,那麼無論您擁有多少項目,您只需要一個「鏈接」表即可實現多對多關係。