多对多关系的适当表模式和对唯一性的关注
Posted
技术标签:
【中文标题】多对多关系的适当表模式和对唯一性的关注【英文标题】:Appropriate table schema for multiple many-to-many relationship and concerns about uniqueness 【发布时间】:2022-01-19 22:10:44 【问题描述】:我正在尝试创建一个简单的数据库来存储各种工作列表。就这个问题而言,假设我有 5 个不同的工作机会:
╔══════════════════╦═════════════════╦═════════════════════════╗
║ title ║ level ║ skills ║
╠══════════════════╬═════════════════╬═════════════════════════╣
║ Python Developer ║ Trainee, Junior ║ Python, SQL, Django ║
║ Python Developer ║ Trainee, Junior ║ Python, REST API, Flask ║
║ Python Developer ║ Senior ║ Python, REST API, Flask ║
║ QA Engineer ║ Mid ║ React, AWS ║
║ QA Engineer ║ Senior, Expert ║ Java, AWS, SQL ║
╚══════════════════╩═════════════════╩═════════════════════════╝
如您所见,每份工作机会都包含三项内容:职称(只是工作头衔)、级别(雇主要求的经验水平)和技能(特定工作职位所需的技能)。现在,因为我想将所有内容都放入关系数据库模型中,所以我不能让它保持原样,我需要重新组织它,以便一切正常(换句话说,我需要满足范式标准)。所以我决定我需要基于列创建 3 个新表:title
、level
和 skills
+ 2 个桥(链接)表:title_level
和 title_skills
,因为存在多对多关系.创建这 5 个表并在每个表中插入适当的数据后,一切看起来像这样:
加入后的结果是这样的:
这还不错,但我有疑问。 我的主要问题是:这种情况是否适合这种表架构?我主要关心的是每个职位发布的独特性。如果您查看title
表,您会注意到我决定将每个职位名称视为一个单独的值,以便每个职位都有唯一的 id(这很合乎逻辑:5 个职位和 5 个 id)。但我很好奇是否有权以这种方式做事,因为这种方法导致我遇到title
表中的标题列重复的情况。所以也许我应该去掉重复项,让这个表只剩下两行:Python Developer
和QA Engineer
?但是,如果我这样做,那么我如何区分工作机会呢?我的意思是除非我将 id 列放在某个表中(我不知道在哪里),否则不会有唯一性。
【问题讨论】:
在您的模型中,您缺少“工作职位”表。这个应该和“Position_Level”和“Position_Skill”有关。职称可以只是职位的一个属性;或者你可以单独建模(我认为这里没有必要)。 技能不是跟等级有关,而不是标题吗? @The Impaler 我需要进一步解释你的想法。这个“职位”表的目的是什么?它需要哪些新列? @Gilbert Le Blanc 你的意思是在“技能”表和“级别”表之间创建一个链接表吗?里面会有哪些列? @beginsql 您的 ER 模型缺少实体“工作机会”,我认为这是一个主要实体。该实体应与“title”具有 N:1 关系,M:N 与“level”以及 M:N 与“skill”。 【参考方案1】:以下是我创建此职位发布数据库的方法。我保留了您的 Title
、Level
和 Skills
表。我正在创建这两个联结表。
Job Posting
-----------
Job Posting ID
Title ID
Level ID
Posted Timestamp
Need By Timestamp
Expires Iimestamp
...
其中 Job Posting ID 是主键和 (Title ID, Level ID) 上的索引
PostingSkills
-----------
Job Posting ID
Skills ID
Experience needed in months
...
其中 (Job Posting iD, Skills ID) 是主键。
【讨论】:
如果我按照您的方式进行操作,那么“标题”表中的标题列就不必重复了,对吗?我的观点是,在“职称”表中使用重复职称及其唯一 ID 的整个想法是为了保持每个工作机会的独立性。但是,如果我理解正确,您希望将每个工作机会的这种独立性(唯一性)移到“职位发布”表中,更具体地说,移动到职位发布 ID 列中,以便每个职位发布都有自己的职位发布 ID 是吗? @beginsql:是的,我的目标是创建独特的招聘信息。 20 个职位发布行意味着 20 个不同的职位发布。我单独留下了 Title 表,因为大多数职称是通用的,但特定的海报可能有独特的职称。 抱歉我的好奇,但如果您的职位发布表中的一行表示 1 个特定职位发布,那么如果特定职位发布有 2 个级别,例如在我的主要问题中的第一行(“ Python 开发者”称号)?我需要两行来说明这种关系,如果我以这种方式这样做,那么他们的职位发布 ID 是不同的,这意味着它们不属于同一个职位发布(这当然不是真的)。无论如何,感谢您耐心回答我的问题。 @beginsql;所以,你说的是,一份工作可以有多个职位。这与我们大多数人对“工作”的定义不同。它是您的数据库,随心所欲。以上是关于多对多关系的适当表模式和对唯一性的关注的主要内容,如果未能解决你的问题,请参考以下文章