每张桌子真的需要PK吗?

时间:2012-07-18 20:47:49

标签: database-design

我正在创建一个数据结构,其中一个表没有任何明确的单一性。

这是一个保存付款条目的表(因此两个条目可能相同)

它将被链接,但在一对多的基础上。即返回账号= x

的所有行

它将用于显示,不会更新或仅删除插入。

我停下来考虑这个表是否需要一个主键,而我的大学坚持认为每个表都应该有一个主键,无论如何。所以他添加了一个递增的id(使用序列)。

对我而言,这意味着    有一个序列正在使用资源而不是真正贡献任何东西。    在表上创建一个永远不会被使用但会有开销的索引。    如果我在紧急情况下需要删除一条特定的线路,我可以使用内置的rowid。

我知道桌子应该有PK,但每张桌子真的需要吗?我错过了什么吗? 谢谢你的时间。

3 个答案:

答案 0 :(得分:3)

您的表几乎肯定需要主键。身份证号码不是答案。

主键等效。 (例如,NOT NULL UNIQUE约束。)

如果你没有id号就无法区分一件事,那么你就无法用一个id号来区分一件事

如果没有密钥,付款条目表最终可能会像这样。

account_id  payment_type  payment_amount
--
10167       cash          $10.00
10167       cash          $10.00
10167       cash          $10.00
10167       cash          $10.00

有关付款的常见问题可能包括

  • 对帐户10167付了多少笔钱?
  • 帐户10167支付了多少钱?

你可能想回答“4”和40.00美元。但其中两个条目是重复的。 (编程错误,可能。有些日子我受到“Hello,world”的挑战。你不能指望我一直都能得到这些复杂的东西。)

如果您更改我的原始表格以获取身份证号码,您最终会得到这个。

id    account_id  payment_type  payment_amount
--
1     10167       cash          $10.00
2     10167       cash          $10.00
3     10167       cash          $10.00
4     10167       cash          $10.00

你仍然无法分辨出两个重复的条目。

答案 1 :(得分:1)

让我提出一个更哲学的观点......

表只是关系的物理表示。并且任何给定的元组最多只能存在一次关系(关系是一个集合,一个元素可以属于或不属于一个集合;它不能属于多个集合。)

如果没有密钥,因此无法区分各个行,则可能有多个物理行代表相同的逻辑元组。您没有向系统添加任何有用的信息,只是浪费空间。


在您的特定情况下,无钥匙表的逻辑含义......

account   amount
123       $10.00

...与(例如)......

完全相同
account   amount
123       $10.00
123       $10.00
123       $10.00
123       $10.00

如果您确实想要知道$10.00已向帐户123支付了4次,为什么不只是......

account   amount    count
123       $10.00    4

...并将{account, amount}作为密钥?从理论上讲,通过将现有列放在键中并添加计数,您始终可以将无密钥表转换为键控表。

但在实践中,您可能并不关心任何特定金额的支付次数 - 您关心的是订单和/或支付时间(以及关于支付的正确金额)结束)。那么为什么不把关键基础呢?

答案 2 :(得分:0)

这是一种常见做法,是的。这是规范化数据的一部分,是的。

但有时你必须非规范化才能正确存储数据并让上层按原样读取数据。所以答案是否定的,这不是一颗银弹。

尝试使用索引来增强查询并正确设计数据库(确定正确的PK / FK,如果可用),以适当的方式进行规范化,以保持应用程序的控制和需求。