首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是使用复合键还是从其他表中使用主键?

是使用复合键还是从其他表中使用主键?
EN

Database Administration用户
提问于 2021-07-25 07:41:17
回答 1查看 756关注 0票数 0

我们有一个教育项目,有以下实体:

  • 域(例如,编程、UI/UX、AI、ML),每个域有5个级别(1、2、3、4、5)
  • 构建块--类似于一些小的主题,比如java、多线程、循环、原型化、用户访谈。域中的每个级别都是由多个构建块生成的。
  • 学习资产(就像学习概念的链接--它可以与多个构建块相关联),而且这些学习资产被映射到特定的域->级->构建块

以下是我们所想到的表格:

Domain

代码语言:javascript
复制
|    id     |      Name          |     
|    10     |      UIUX          |    
|    11     |      Programming   |    
|    12     |      AI            |    

Building Blocks

代码语言:javascript
复制
|    id    |      Name               |     
|    1     |       loops             |    
|    2     |     multi-threading     |    
|    3     |     user-interview      |   

然后,我们将构建块的映射存储到域级别。

Domain-Level-BuildingBlocks映射表

代码语言:javascript
复制
|  DLB_Id    |       domainId   |   level      |   buildingBlockId 
|    100     |        11        |    1         |    1
|    200     |        11        |    2         |    2
|    300     |        10        |    1         |    3

在这个表中- (domainId, level, buildingBlockId)形成一个复合键

Learning Asset

代码语言:javascript
复制
|    id    |       Name                 |   link     
|    1     |      Loop Notes            |    https://a.com       
|    2     |       Operators            |    https://b.com       
|    3     |       Process and Threads  |    https://c.com 

学习资产可以连接到多个构建块

Learning Asset -BuildingBlocks映射表

代码语言:javascript
复制
|    id    |       learningAssetId  |     buildingBlockId 
|    1     |        1               |        1
|    2     |        2               |        1
|    3     |        3               |        2

现在,如果学习资产适用于域级-构建块组合,则管理员可以选择

Learning Asset-Domain-Level-BuildingBlocks映射表(表A)

代码语言:javascript
复制
|    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)

代码语言:javascript
复制
|    id    |       learningAssetId  |   DLB_Id   
|    1     |        1               |      100   
|    2     |        3               |      200     
  1. 我的问题是是使用表A还是表B
  2. 如果表B是正确的方式,我应该通过组合DLB_Id来生成domainId + "-" + level + "-" + buildingBlockId作为字符串,而不是使用自动增量Integet。生成的字符串上的索引是否与自动增量整数主键一样有效?生成字符串的原因是,当我们需要获取属于域级别-构建块组合的学习资产时,我不需要使用Domain-Level-BuildingBlocks映射表,而是可以在Learning Asset-Domain-Level-BuildingBlocks映射表中直接查找生成的字符串Id

Learning Asset-Domain-Level-BuildingBlocks映射表(表C)

代码语言:javascript
复制
|    id    |       learningAssetId  |         DLB_Id   (as generated string)
|    1     |        1               |        '11-1-1'
|    2     |        3               |        '11-2-2'

即表B或表C?

谢谢

EN

回答 1

Database Administration用户

回答已采纳

发布于 2021-07-25 16:17:00

一般来说,映射表不需要自己的id。相反,PRIMARY KEY应该是一个复合键,其中的2(或更多)列in引用多到多关系中相关的表。

对于一对多的关系,一个映射表是不必要的.

你的"DLB“闻起来像是一种”关系“,因此上面的评论也适用。如果,相反,你可以合理地把它看作一个“实体”,那么它就会有自己的id。而且它可能会有更多的属性列的“实体”。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/296127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档