2017-10-18 64 views
1

我正在與製造業的客戶合作,他們的產品是同一批零件的配置。我正在創建一個包含所有有效產品及其物料清單的數據庫。在決定物料清單計劃實施時,我需要幫助。物料清單:一張桌子,或者每個子級別的表格?

顯而易見的解決方案是用接線表許多一對多的關係:

Table 1: Products 
Table 2: Parts 
Junction Table: products, parts, part quantities 

然而,也有我的客戶的產品多層次的;

-Assembly 
    -Sub-Assembly 
     -Component 
      -Part 

並允許來自較低級別的項目與任何較高級別項目相關聯;

Assembly  |Sub-assembly 
Assembly  |Component 
Assembly  |Part 
Sub-Assembly |Component 
Sub-Assembly |Part 
Component |Part 

我懷疑客戶會在未來添加新產品系列時添加更多關卡。

糾正我,如果我錯了,但我相信上述關係表將要求越來越多的聯結表和查詢整數序列(0 + 1 + 1 + 2 + 3 ...)來顯示和導出整個比爾可能最終影響性能的材料。

有人建議把一切都在一個表:

Table 1: Assemblies, sub-assemblies, components, parts, etc... 
Junction table: Children and Parents 

這隻需要一個連接表中創建許多一對多的關係無限的水平。我不知道我是否相信這個解決方案,但除了意外地將一個項目作爲自己的父項並創建一個無限循環並且聽起來雜亂無章以外,我無法想到任何其他問題。

我缺乏經驗來確定這兩種模式中的哪一種或兩種都不適合我的客戶。我正在MS Access中繪製這些模型,但如果有必要,我願意將此項目移至更強大的平臺。任何輸入讚賞。謝謝。

-M

回答

0

你所描述的是一個層次結構。因此它應採取的形式:

part_hierarchy:

part_id | parent_part_id | other | attributes | of | this | relationship 

所以PART_ID 1可以有一個父PART_ID 10「部件」可以具有parent_part_id 12的(當在該表中查找本身)「大會它會是什麼樣子:

part_id | parent_part_id 
1  | 10 
10  | 12 

和零件表:

part_id | description 
1  | widget 
10  | widget component 
12  | aircraft carrier 

這是一個LITT簡化,因爲它沒有考慮到你的產品/部件關係,但它將全部使用這種方法進行整合。

不錯,簡單。現在,無論層級結構如何深入都無關緊要。它仍然只有兩列(和任何額外的列需要這種關係的屬性,如... create_date,last_changed_by_user,等等。

我會建議比訪問更強大的東西,因爲它缺乏使用遞歸CTE(SQL Server,Postgres,Oracle等提供的東西)來選擇層次結構的功能。

我會100%避免任何架構,因爲層次結構變得更深和更復雜,要求您添加更多的字段或表。那是導致痛苦和遺憾的一條途徑。

+0

該模式可在行創造了很多的浪費空間屬性補充說,只有對應於一個級別。它也會使驗證有問題:何時可以將屬性設置爲空等。 – nicomp

+0

如果屬性僅適用於特定級別,則它不屬於該表格。這些將是該部分與其父項之間關係的屬性。作爲關係一部分的ID的屬性可以屬於爲該層次的分支構建的任何公共表。也許這個層次結構有三個組件。根(部分),分支(純粹用於像「組件」的關係的ID)和葉子(部分)。或者是反轉/顛倒版本,取決於OP的意義。所以4桌。 – JNevill

+0

我認爲您的解決方案的組合將爲我工作。一個包含所有部件的表格,一個包含部件類型(組件,組件等)的表格,一個部件/部件類型的連接表格以及一個部件/父部件的連接表格。樹形結構不會在part/parent part連接表中被推斷出來,而不需要指出它是什麼樣的關係(例如,彙編到子彙編)? – mateohao

0

由於嵌套級別是任意的,因此可以使用一個表與自引用的parent_id外鍵。

雖然這在技術上是正確的,但瀏覽它需要大多數數據庫不支持的遞歸查詢。但是,簡單有效地訪問嵌套部分的方法是將一個「路徑」存儲到每個組件,這看起來像文件系統中的路徑。

舉例來說,假設部分ID 1是具有一個子id爲2,並且部分ID 2具有ID爲3的子部分的頂部電平部分,路徑將是:

id parent_id path 
1  null   /1 
2  1   /1/2 
3  2   /1/2/3 

否則這意味着找到的子部分的任何部分的樹很簡單:

select b.part 
from parts a 
join parts b on b.path like concat(a.path, '%') 
where a.id = ?