我有表“用户”(用户名,密码)和表“档案”(简档,性别,出生日期,...)。 目前我使用这种方法:每个档案记录有一个名为“用户id”作为链接到用户表的外键字段。 当用户注册时,他的档案记录被自动创建。 我很困惑我的朋友建议:有“用户id”字段作为外国和主键和删除“简档”字段。 哪种方法更好呢?
Answer 1:
外键几乎都是“允许重复”,这将使得它们不适合作为主键。
相反,找到唯一标识表中的每个记录的字段,或添加新的领域(无论是自动递增的整数或GUID)作为主键。
唯一的例外是有一个一对一的关系,这里的链接表的外键和主键是同一个表。
Answer 2:
主键总是需要是唯一的,外键需要允许非唯一值,如果表是一个一对多的关系。 这是完全正常使用外键作为主键如果表是由一个一对一的关系,不是一个一对多的关系连接。 如果你想在同一用户记录成具有超过1个相关的配置文件记录的可能性,去与一个单独的主键,你有什么,否则坚持。
Answer 3:
它通常被认为是不好的做法,有一个一对一的关系。 这是因为你可能只是有一个表表示的数据,并获得相同的结果。
然而,也有情况下,您可能无法使这些改变你引用的表。 在这种情况下有使用外键作为主键没有问题。 它可以帮助有包括自动递增独特的主键和外键的组合键。
我目前工作的一个系统,用户可以登录并生成一个注册码与应用程序即可使用。 至于原因,我不会进入我无法简单地添加需要的用户表中的列。 所以,我打算下了一个与代码表中的一个途径。
Answer 4:
是的,这是合法的,有一个主键的外键。 这是一种罕见的结构,但它适用于:
1:1关系。 这两个表不能因为不同的权限和特权的一个合并仅适用于表级(2017年,这样的数据库将是奇数)。
1:0..1关系。 资料可以或可以不存在,这取决于用户类型。
性能是一个问题,而设计作为一个分区:配置表很少被访问,主持一个单独的磁盘上或比users表中有不同的分片策略。 如果强调存储为柱状就没有意义。
Answer 5:
是,外键可以是一个的情况下,这些表之间的一个关系中的主键
Answer 6:
我不会那么做的。 我将保持profileID
为表的主键Profile
外键是两个表之间只是一个参考约束
有人可能会说,一个主键是必要的,因为它是指从其它表给它的任何外键的目标。 外键是在任何表格中的一些主键列(第)发现一组一个或多个列的(不一定是候选键,更不用说主键,该表的),可容纳值(一个或多个)其他表。 因此,我们必须有一个主键相匹配的外键。 或者必须是吗? 在主键/外键对中的主键的唯一目的是提供一种明确的加入-以维持相对于保持该引用的主键的“外源”表参照完整性。 这保证了到外键是指值将始终是有效的(或空,如果允许的话)。
http://www.aisintl.com/case/primary_and_foreign_key.html
Answer 7:
这取决于业务和系统。
如果您的用户id是独特的,将是独一无二的所有的时间,你可以使用用户ID作为主键。 但是,如果你想扩展您的系统,它会刁难。 我劝你在添加用户表的外键,以与表的个人资料,而不是添加在表的个人资料外键关系。