【问题标题】:How to create a composite key in SQL using the same attribute several times如何在 SQL 中多次使用相同的属性创建复合键
【发布时间】:2021-01-08 20:35:06
【问题描述】:

有谁知道如何插入多个 staff_id 值? TABLE author 是我的表 Articles 和 Staff 之间的交集表。在这种情况下,我想插入 2 名工作人员。因此,对于我想要的结果,我希望它说 staff_id 1 和 2 在 article_id 1 上工作。

这是上面代码的输出。我的意思是它有效,但在我看来它会创建太多行。

我想让它连续说,staff_id 1 和 2,写 article_id 1。

我尝试使用此代码创建复合键

CREATE TABLE author(
staff_id INTEGER NOT NULL REFERENCES Staff(staff_id),
staff_id INTEGER REFERENCES Staff(staff_id),
staff_id INTEGER REFERENCES Staff(staff_id),
staff_id INTEGER REFERENCES Staff(staff_id),
staff_id INTEGER REFERENCES Staff(staff_id),
staff_id INTEGER REFERENCES Staff(staff_id),
PRIMARY KEY (staff_id, staff_id, staff_id, staff_id, staff_id, staff_id)
);

但它给了我一个错误“列“staff_id”在主键约束中出现两次”。

【问题讨论】:

  • 它们不是太多行。这是正确的做法。
  • 您使用链接表的方法很好。这是创建多对多关系的一种干净且标准的方式。不用担心行数。
  • 那么,当你让 8 名员工写一篇文章时会发生什么?你拥有它的方式实际上是最好的方式。是的,它创建了多行——一篇文章的每个员工都有一个,但它是规范化的并且更容易查询。想象一下,如果您必须找到某个特定员工撰写的所有文章。
  • 列名在表中必须是唯一的。您不能有多个 staff_id 列。
  • 出于好奇:您认为有多少行“太多”?千万?一亿?十亿?

标签: sql postgresql database-design


【解决方案1】:

在我看来,您正在建模与 staff_if 和 article_id 的多对多关系。在这种情况下,您的第一个表作者是正确的解决方案。

可能看起来有很多行,但每一行都表示文章和员工之间的不同关系。

数据库管理系统经过优化,可以处理大量数据,因此在这种情况下我不会过多担心性能。

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 2010-12-05
    • 2015-04-25
    • 2011-04-24
    • 2011-06-09
    • 2013-12-16
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多