Mysql

我應該使用其他表中的複合鍵還是主鍵

  • July 25, 2021

我們有一個教育項目,它有以下實體:

  • 領域(例如程式、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_idDomain-Level-BuildingBlocks**

像這樣的東西:

Learning Asset-Domain-Level-BuildingBlocks映射表**(表 B)**

|    id    |       learningAssetId  |   DLB_Id   
|    1     |        1               |      100   
|    2     |        3               |      200     
  1. 我的問題是使用表 A 還是表 B
  2. 如果表 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。它可能會有更多的“實體”屬性列。

引用自:https://dba.stackexchange.com/questions/296127