有外键作为主键是好的吗?

我有表“用户”(用户名,密码)和表“configuration文件”(profileId,gender,dateofbirth,…)。 目前我正在使用这种方法:每个configuration文件logging都有一个名为“userId”的字段作为链接到用户表的外键。 当用户注册时,他的个人档案logging是自动创build的。 我对我的朋友build议感到困惑:将“userId”字段作为外键和主键,并删除“profileId”字段。 哪种方法更好?

外键几乎总是“允许重复”,这将使它们不适合作为主键。

而是find唯一标识表中每个logging的字段,或者添加一个新字段(自动递增整数或GUID)作为主键。

唯一的例外是具有一对一关系的表,其中链接表的外键和主键是相同的。

主键总是需要唯一的,如果表是一对多的关系,外键需要允许非唯一的值。 如果表是通过一对一关系而不是一对多关系连接的,那么使用外键作为主键是完全正确的。 如果你想要有相同的用户logging有可能有超过1个相关的configuration文件logging,去一个单独的主键,否则坚持你有什么。

有一对一的关系通常被认为是不好的做法。 这是因为您可以将数据表示在一个表中,并获得相同的结果。

但是,有些情况下您可能无法对引用的表进行这些更改。 在这种情况下使用外键作为主键没有问题。 这可能会有帮助,有一个复合键组成的一个自动递增唯一的主键和外键。

我目前正在开发一个系统,用户可以login并生成一个注册码,以便与应用程序一起使用。 由于我不会去的原因,我无法简单地将所需的列添加到用户表。 所以我正在用代码表一路走下去。

这取决于业务和系统。

如果您的userId是唯一的并且始终是唯一的,则可以使用userId作为主键。 但是,如果你想要扩展你的系统,这将会使事情变得困难。 我build议您在表用户中添加一个外键,以便与表格configuration文件build立关系,而不是在表格configuration文件中添加外键。

我不会这样做的。 我将保持profileID作为表格Profile主键

外键只是两个表之间的引用约束

有人可能会争辩说,主键是必要的,作为从其他表引用它的任何外键的目标。 外键是任何表中的一个或多个列的集合(不一定是候选键,更不用说该表的主键),其可以保存在一些(一个或多个)主键列中find的值其他表。 所以我们必须有一个主键来匹配外键。 或者我们必须? 主键/外键对中主键的唯一目的是提供一个明确的连接 – 保持关于包含引用主键的“外部”表的参照完整性。 这确保外键引用的值始终有效(如果允许,则为null)。

http://www.aisintl.com/case/primary_and_foreign_key.html

是的,在这些表之间存在一对一关系的情况下,外键可以是主键