什么是主键?

时间:2011-07-04 15:16:56

标签: database-design nhibernate-mapping

我对数据库设计有疑问。 我有两个表,usertable和historytable,这是一对多的关系,其中usertable包含

  • 用户名主键
  • passwordname
  • 电子邮件

和历史记录

  • 用户名外键
  • 日期
  • visted url

如果历史记录没有定义主键,我不确定在性能方面是否有任何负面影响,如果有,那么历史记录中哪个最佳选项是主键?

感谢。

4 个答案:

答案 0 :(得分:2)

您需要定义一个新列:UserHistoryId 将其标识为

原因是其他列的组合在所有情况下都不是唯一的。

e.g。如果一天内为同一个网址的用户创建了两次历史记录。

性能:

取决于历史表的使用方式 - 如果您只是通过对userId,date或Url的查询从中选择数据,那么ID列将没有用处。

但是,如果您在表上执行任何更新/删除操作,那么Id将非常有用。

无论目前的要求如何,现在几乎没有任何费用可以包含额外的列,这是我一直推荐的。

答案 1 :(得分:2)

如果您看不到明显的primay键,那么只需添加一个自动递增的整数/标识列作为主键 - 这几乎适用于任何表。

可能有一些情况有更好的选择,但大多数情况下,自动增量整数字段是主键的一个很好的选择。

事实上,我可能会建议使用自动递增的整数/标识列作为用户表的主键 - 有几种情况(例如已删除的用户),您可能希望有两行具有相同的用户名

答案 2 :(得分:1)

你可以查看this one。虽然这个问题比你的问题更通用,但它可以让你更广泛地了解什么应该是主键。

答案 3 :(得分:0)

我的猜测是历史表可能的关键字(用户名,日期,网址)。但这只是基于属性名称的猜测。您应该根据业务分析和您的要求确定密钥。