我正在创建一个数据结构,其中一个表没有任何明确的单一性。
这是一个保存付款条目的表(因此两个条目可能相同)
它将被链接,但在一对多的基础上。即返回账号= x
的所有行它将用于显示,不会更新或仅删除插入。
我停下来考虑这个表是否需要一个主键,而我的大学坚持认为每个表都应该有一个主键,无论如何。所以他添加了一个递增的id(使用序列)。
对我而言,这意味着 有一个序列正在使用资源而不是真正贡献任何东西。 在表上创建一个永远不会被使用但会有开销的索引。 如果我在紧急情况下需要删除一条特定的线路,我可以使用内置的rowid。
我知道桌子应该有PK,但每张桌子真的需要吗?我错过了什么吗? 谢谢你的时间。
答案 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
有关付款的常见问题可能包括
你可能想回答“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,如果可用),以适当的方式进行规范化,以保持应用程序的控制和需求。