3

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

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

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

它将用于显示,没有更新或删除,只有插入。

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

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

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

4

3 回答 3

3

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

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

如果没有身份证号码就不能区分一件事和另一件事,那么你就不能用身份证号码区分一件事和另一件事

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

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 美元。但是其中两个条目是重复的。(可能是编程错误。有时我会受到“你好,世界”的挑战。你不能指望我总是把这些复杂的东西弄对。)

如果你改变了我原来的表格来获取一个身份证号码,你最终会得到这个。

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

而且您仍然无法分辨出有两个重复的条目。

于 2012-07-18T21:07:18.610 回答
1

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

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

由于没有键,因此无法区分各个行,您可能有多个物理行表示相同的逻辑元组。您没有向系统添加任何有用的信息,您只是在浪费空间。


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

account   amount
123       $10.00

...与(例如)完全相同...

account   amount
123       $10.00
123       $10.00
123       $10.00
123       $10.00

如果您真的知道$10.00已向帐户支付了1234 次,为什么不直接...

account   amount    count
123       $10.00    4

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

但在实践中,您可能不太关心任何特定金额的支付次数 - 您关心订单和/或付款时间(以及最后是否有正确的金额)。那么为什么不以此为基础呢?

于 2012-07-18T22:00:44.003 回答
0

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

但有时您必须进行非规范化才能正确存储数据并让上层按原样读取数据。所以答案是否定的,这不是灵丹妙药。

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

于 2012-07-18T20:55:08.993 回答