Mysql
我應該使用其他表中的複合鍵還是主鍵
我們有一個教育項目,它有以下實體:
- 領域(例如程式、UI/UX、AI、ML),每個領域有 5 個級別(1、2、3、4、5)
- 建構塊 - 類似於小主題,例如 java、多執行緒、循環、原型設計、使用者訪談。域中的每個級別都是由多個建構塊建構的。
- 學習資產(就像一個研究概念的連結 - 它可以與多個建構塊相關聯)並且這些學習資產進一步映射到特定的域 -> 級別 -> 建構塊
這些是我們想到的表格:
Domain
| id | Name | | 10 | UIUX | | 11 | Programming | | 12 | AI |
Building Blocks
| id | Name | | 1 | loops | | 2 | multi-threading | | 3 | user-interview |
然後我們儲存建構塊到域的映射 - 級別
Domain-Level-BuildingBlocks
映射表| DLB_Id | domainId | level | buildingBlockId | 100 | 11 | 1 | 1 | 200 | 11 | 2 | 2 | 300 | 10 | 1 | 3
在這個表中 -
(domainId, level, buildingBlockId)
形成一個複合鍵
Learning Asset
桌子| id | Name | link | 1 | Loop Notes | https://a.com | 2 | Operators | https://b.com | 3 | Process and Threads | https://c.com
一個學習資產可以連接到多個建構塊
Learning Asset -BuildingBlocks
映射表| id | learningAssetId | buildingBlockId | 1 | 1 | 1 | 2 | 2 | 1 | 3 | 3 | 2
現在管理員可以選擇學習資產是否適用於域級建構塊組合,因此
Learning Asset-Domain-Level-BuildingBlocks
映射表**(表 A)**| id | learningAssetId | domainId | level | buildingBlockId | 1 | 1 | 11 | 1 | 1 | 2 | 2 | 11 | 1 | 1
在這個表中 -
(domainId, level, buildingBlockId)
形成一個複合鍵我的問題在上表中:我應該再次儲存**(domainId, level, buildingBlockId)還是應該使用表中的主鍵DLB_id
Domain-Level-BuildingBlocks
**像這樣的東西:
Learning Asset-Domain-Level-BuildingBlocks
映射表**(表 B)**| id | learningAssetId | DLB_Id | 1 | 1 | 100 | 2 | 3 | 200
- 我的問題是使用表 A 還是表 B
- 如果表 B 是正確的方法,我應該通過組合
domainId + "-" + level + "-" + buildingBlockId
而不是使用自動增量整數主鍵將 DLB_Id 生成為字元串。生成的字元串的索引是否與自動增量整數主鍵一樣有效。生成字元串的原因是,當我們需要獲取屬於 Domain-Level-BuildingBlock 組合的學習資產時,我不需要使用映射表——而是可以直接在映射Domain-Level-BuildingBlocks
中查找生成的字元串 IdLearning Asset-Domain-Level-BuildingBlocks
桌子
Learning Asset-Domain-Level-BuildingBlocks
映射表**(表 C)**| id | learningAssetId | DLB_Id (as generated string) | 1 | 1 | '11-1-1' | 2 | 3 | '11-2-2'
即表 B 或表 C ?
謝謝
通常,映射表不需要自己的 id。相反,
PRIMARY KEY
應該是一個複合鍵,其中 2 個(或更多)列 ID 引用在多對多關係中相關的表。對於一對多的關係,映射表是不必要的。
您的“DLB”聞起來像“關係”,因此上述評論適用。相反,如果您可以合理地將其視為“實體”,那麼它將有自己的 id。它可能會有更多的“實體”屬性列。