否定键有什么用?


12

使用标准SQL数据库的某些新知识(当前大多数情况下是与MySQL配合使用)到目前为止,我还没有遇到过很多用法。

什么时候以及为什么使用负(或带符号)键索引表是有用的?


5
首先,无论谁在不留下反馈的情况下投票否决,就是对您有害。接下来,这个极好的问题的答案。
jcolebrand

1
这个主题很有趣。我个人从未听说过这个概念。这个问题不应该被否决。向我+1来介绍这个概念。
RolandoMySQLDBA 2011年

Answers:


13

所有主键都是我们确定的值,它是记录中最重要的值。无论该键是有符号的int,无符号的int,字符串,blob(实际上是有限制的)还是UUID(或今天使用的任何名称),事实仍然表明它是键,并且它是最重要的事情。

由于我们不限于只使用正向数字作为键,因此考虑带符号的int只能达到约20亿,而无符号的int可以达到约40亿是有道理的。但是,使用带符号的int,将初始值设置为〜-20亿并设置增量为1并没有错。在达到约20亿条记录之后,您将达到“零”,然后您将继续达到约20亿。

至于为什么在表中包含“负键”会有所帮助,这与“为什么在表中包含键为什么有帮助”是同样的问题。密钥的“值”对其密钥状态没有影响。一键就是一键就是一键。

重要的是密钥是否有效。

至于为什么允许使用负数键会很有用,我可以提出一些原因:

如果要在销售系统中将退货指示为负销售订单号,该数字与正销售订单号相匹配,从而使关联变得容易(这很幼稚,设计欠佳,但在“电子表格”意义上有效)。

如果您想拥有一个用户表,并指出带有负数的表是系统控制的,那该怎么办(对于聊天供稿用户,这是可以做到的)。

我可以继续,但实际上负数之所以重要的唯一原因是您或我是否对其给予重视。除此之外,没有充分的理由使钥匙的价值与钥匙本身有关。


删除了“利基发生”位,因为很可能是由于经验不足造成的误解。有趣的阅​​读。我当时在想一种情况,在这种情况下,密钥的负值在某种程度上对编码很有用(即,如果没有确定它意味着特定的事情),但是当您将两部分强分为两部分时,这非常有用。不想使用额外的布尔值:p
Garet Claborn

1
@Garet〜因此,您有一个要点:“密钥的值在某种程度上对编码有用”,我确实会不时地以这种方式使用密钥,但这与数据库无关。该数据库是一个仓库。另一方面,使用数据的应用程序关心这些。但是,是的,+ /-布尔值是一个巧妙的技巧,我已经看到它花了很多时间才达到这种效果。
jcolebrand

2
-1表示这样的双重宗旨价值观不是一个坏主意。您需要整数和布尔值吗?使用整数和布尔值。
杰克说请尝试topanswers.xyz 2011年

1
@JackPDouglas我不记得鼓励人们这样做了,我严格记得这暗示着该领域及其数据是两件事。感谢您至少提供有关您的否决票的建设性反馈,但是我不能说根据“什么是负键”的概念,这种观察有任何意义,因为那是应用程序逻辑问题,而不是数据库层问题。我确实想强调这些东西如何在应用程序层中使用,但是在数据库层中它们没有任何意义。
jcolebrand

1
@JackPDouglas〜我使用了该特定示例,因为您可能听说过一个非常知名的站点(站点网络),它确实可以做到这一点,所以我不想对此不屑一顾,因为它是有效的“特技”。出该用户dba.stackexchange.com/users/-1/community并告诉我他的ID是什么。我几乎可以向您保证userid是主键(在许多其他表中是外键)。仅仅因为这对您而言是不好的应用程序设计,并不意味着它是无效的。但是,这又不是数据库设计,而是域设计。诚然,数据库逻辑支持它
jcolebrand

10

如果我们使用identity或autonumber列,则值本身应该没有任何意义。(有时会这样,根据drachenstern提到的SO的聊天用户,这是我自己做过的)

但是,如果使用带符号整数,通常会丢失一半的范围。
请参阅:表中的字段接近最大有符号或无符号32位整数时该怎么办?

另一个示例:在小型复制方案中,对于一个站点使用负值,对另一个站点使用正值,则可以隐含地了解任何给定行的源。


并确保以某种方式限制每个站点的输入值,否则当您的“内隐知识”被证明是错误的时,您将陷入一团糟。
杰克说请尝试topanswers.xyz 2011年

@JackPDouglas:你不要使用复制,以避免在错误的网站产生价值
GBN

连同检查约束?另外,是否有NOT FOR REPLICATION您知道的MySQL(或其他)类似物?
杰克说请尝试topanswers.xyz 2011年

@JackPDouglas:对不起,不知道非SQL服务器
GBN

8

并非所有数据库系统甚至都支持无符号整数类型,MSSQL是不支持整数类型的一种。在这些情况下,整数键字段中可能出现负值,只是因为它们在类型中是可能的(如本例所示,您可以使用规则或触发器来阻止它们,但可能无需增加执行此类规则的开销。每次互动/更新)。

就数据库而言,主键的实际值并不重要,只要它在表中是唯一的即可。-42和42只是两个不同的数字,而42和69的含义相同-含义仅是代码的负数或负数。

不支持无符号整数类型可能是基于降低复杂度的设计决策-即,不希望两个不同的32位整数类型在分配它们之间的值时担心检查范围。它确实将自动递增字段中可能从0或1开始的索引数量限制为无符号类型(〜2e9而不是〜4e9)的索引数量的一半,但这很少是一个重大问题(如果您可能需要无论如何,您都可能会使用许多这样大小的键值,尤其是在使用64位体系结构的情况下,此类值的处理效率不低于32位值,尽管您可能需要完整范围并需要如果出于空间原因而坚持使用32位,则可以从-2,147,483,647开始递增。


是的,我想我们之前已经涵盖了这一领域;)tehehedba.stackexchange.com/questions/983/…–
jcolebrand

tinyint是无符号的(0 .. 255)。我通常创建整数列的检查约束,以确保值都是非负的,因为不可避免的代码将被写入隐含假定它和奇怪的虫子会出现莫名其妙是否为负值毛骨悚然英寸
埃德安飞士
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.