问题描述
|
我想在表中存储IP地址列表,以便以后检查系统中是否已使用某些IP。
我想将IP存储在longip模式下(signed int)。而且由于每个IP都是唯一的,所以我想知道是否有必要具有一个入门密钥字段(id,具有自动增量),或者仅将我的longip字段用作主密钥是否合适(更好)。
解决方法
如果将来您必须使用该键将其与另一个表连接,则另一个表应包含所有数字,这会浪费很多空间。
例如,您有一个“计算机”表
在该表中,您使用ip \进行计算。要加入,您需要钥匙吗?因此,如果您通过密钥加入,则应该具有计算机ID和密钥(在本例中为ip)
我强烈建议使用带有自动增量的更简单的id,就像自大型机(as400),iSeries等以来所做的那样。
,我认为Marc_s对问题的回答何时不使用代理主键?可以指导我们
我要说以下标准
被满足:
您的自然钥匙必须绝对,肯定,
不允许例外,唯一
(诸如姓名,社会保障等
数字等通常看起来是唯一的-但实际上不是)
您的自然密钥应与INT一样小,例如没有明显更多
大小超过4个字节(请勿使用
VARCHAR(50)作为您的PK,以及
尤其是对于您的集群密钥而言
在SQL Server中!)
您的自然密码应该稳定,例如永不改变(好的,使用ISO
国家代码,这几乎是既定的-除非南斯拉夫或苏联这样的国家崩溃,或者像两个德国人那样的国家团结在一起-但这很少见。
如果满足这些条件,则可以
将自然键视为您的PK-
但这应该是2%的例外
您所有的表格-不符合规范。
因此,我想您可能应该使用代理主键。如果您想始终将IP用作唯一密钥,
由于您使用的是您指出的longip,因此可以使用它。
,几乎每次您使用自然键开始时,您都将在以后感到后悔。某些事情会发生,它的墨菲定律。避免麻烦,只需添加ID列即可。
如果它是自动增量,您不喜欢使用uuid。 MySql有一个uuid函数可以简化这一过程。