复合主键或单主键

发布于 2024-09-26 09:35:35 字数 1307 浏览 3 评论 0原文

是使用单个主键更好,还是使用复合主键(通常,它们是一个主键和外键的组合)。我有以下示例:

复合主键示例:

AMeta

    --- AMetaId - 主键
    --- AMetaText

BMeta

    --- BMetaId - 主键
    --- AMetaID - 表 AMeta 的外键
    --- BMetaText

A

    --- AId - 主键
    --- AMetaId - 表 AMeta 的主键和外键
    --- AText

B

    --- BId - 主键
    --- BMetaId - 表 BMeta 的主键外键
    --- AId - 表 A 的主键和外键
    --- BText


单主键示例:

AMeta

    --- AMetaId - 主键
    --- AMetaText

BMeta

    --- BMetaId - 主键
    --- AMetaId - 表 AMeta 的外键
    --- BMetaText

A

    --- AId - 主键
    --- AMetaId - 表 AMeta 的外键
    --- AText

B

    --- BId - 主键
    --- BMetaId - 表 BMeta 的外键
    --- AId - 表 A 的外键
    --- BText

哪个数据库设计更好?

Is it better to have a single primary key, or use composite primary keys (usually, they are combination of one primary key and foriegn keys). I have examples below:

Composite Primary Key example:

AMeta

    --- AMetaId - Primary Key
    --- AMetaText

BMeta

    --- BMetaId - Primary Key
    --- AMetaID - Foreign Key to Table AMeta
    --- BMetaText

A

    --- AId - Primary Key
    --- AMetaId - Primary Key and Foreign Key to Table AMeta
    --- AText

B

    --- BId - Primary Key
    --- BMetaId - Primary Key Foreign Key to Table BMeta
    --- AId - Primary Key and Foreign Key to Table A
    --- BText

Single Primary Key example:

AMeta

    --- AMetaId - Primary Key
    --- AMetaText

BMeta

    --- BMetaId - Primary Key
    --- AMetaId - Foreign Key to Table AMeta
    --- BMetaText

A

    --- AId - Primary Key
    --- AMetaId - Foreign Key to Table AMeta
    --- AText

B

    --- BId - Primary Key
    --- BMetaId - Foreign Key to Table BMeta
    --- AId - Foreign Key to Table A
    --- BText

Which is the better Database Design?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埖埖迣鎅 2024-10-03 09:35:35

我通常倾向于几乎完全使用单列主键 - 要么有一个好的自然键可用(很少),要么我向表中添加一个代理 INT IDENTITY 键。

我的主要原因是:

  • 主键必须是唯一的、始终非空
  • 主键默认是 SQL Server 中的集群键,这增加了稳定(不变)、窄(最多 4 字节)和最好 随着单列主键的条件列表不断增加
  • ,我所有的外键也很容易使用单列 - 我不喜欢仅仅为了获得连接而必须在 3、5 甚至更多列上连接两个表工作,如果您有复合主键,这正是发生的情况

I genereally tend to use single-column primary keys almost exclusively - either there is a good natural key available (pretty rarely), or then I add a surrogate INT IDENTITY key to the table.

My main reasons are:

  • the primary key needs to be unique, non-null at all times
  • the primary key is the clustering key in SQL Server by default, which adds stable (non-changing), narrow (4 bytes max.) and preferably ever-increasing to the list of criteria
  • with a single column primary key, all my foreign keys are also easy to use single columns - I don't like having to join two tables on 3, 5 or even more columns just to get the join to work, which is exactly what happens if you have a compound primary key
酒几许 2024-10-03 09:35:35

第一个方案没有意义,因为它暗示(并允许)表 B 中可以有多行具有相同的 BId 值但具有不同的 AId 值,并且与列 Bid 没有关联的意义。是去别的地方的 FK 吗?如果是的话,为了什么呢?如果不是,那么是什么产生了它?这是什么意思?

另一方面,第二种方案在逻辑上是一致的,但意味着表 B 中的行可以

  1. 通过使用 FK 列的表 B 与 表 AMeta 中的两个不同行相关联
    BMetaId 并从那里到表
    AMeta 使用 TableB.AMetaId,并
  2. 通过表 BMeta 使用列
    BMetaId 到表 BMeta 并从
    使用 BMEta.AMetaId 到 AMeta

这真的是您的业务域模型的准确表示吗?

The first scheme makes no sense, because it implies (and allows) that there can be multiple rows in Table B with the same BId value but with different values of AId, and there is no meaning associated with column Bid. Is it a FK to somewhere else? If so, to what? If not, what is generating it ? What does it mean?

The second scheme, on the other hand, is logically consistent, but implies that rows in Table B can be associated with two different rows in Table AMeta,

  1. through Table B using the FK Column
    BMetaId and from there to Table
    AMeta using TableB.AMetaId, and
  2. Through table BMeta using column
    BMetaId to Table BMeta and from
    there to AMeta using BMEta.AMetaId

Is this really an accurate representation of your business domain model?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文