我们有一个教育项目,有以下实体:
以下是我们所想到的表格:
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)还是使用Domain-Level-BuildingBlocks表中的主键DLB_id?
就像这样:
Learning Asset-Domain-Level-BuildingBlocks映射表(表B)
| id | learningAssetId | DLB_Id
| 1 | 1 | 100
| 2 | 3 | 200 domainId + "-" + level + "-" + buildingBlockId作为字符串,而不是使用自动增量Integet。生成的字符串上的索引是否与自动增量整数主键一样有效?生成字符串的原因是,当我们需要获取属于域级别-构建块组合的学习资产时,我不需要使用Domain-Level-BuildingBlocks映射表,而是可以在Learning Asset-Domain-Level-BuildingBlocks映射表中直接查找生成的字符串IdLearning Asset-Domain-Level-BuildingBlocks映射表(表C)
| id | learningAssetId | DLB_Id (as generated string)
| 1 | 1 | '11-1-1'
| 2 | 3 | '11-2-2'即表B或表C?
谢谢
发布于 2021-07-25 16:17:00
一般来说,映射表不需要自己的id。相反,PRIMARY KEY应该是一个复合键,其中的2(或更多)列in引用多到多关系中相关的表。
对于一对多的关系,一个映射表是不必要的.
你的"DLB“闻起来像是一种”关系“,因此上面的评论也适用。如果,相反,你可以合理地把它看作一个“实体”,那么它就会有自己的id。而且它可能会有更多的属性列的“实体”。
https://dba.stackexchange.com/questions/296127
复制相似问题