我想在表中存储一个IP ADDRESS列表,以便稍后检查我的系统中是否已经使用了某些IP。
我想将ip存储在longip模式下(signed int)。并且由于每个IP都是唯一的,我想知道是否需要有一个质量关键字段(id,带有自动增量)或者它的okey(以及更好)只使用我的longip字段作为主键。
答案 0 :(得分:2)
如果将来你必须使用密钥将它与另一个表连接,那么另一个表应该包含所有的数字,这就浪费了很多空间。
例如,你有一个“计算机”表在该表中,您已经使用ip进行计算。加入你需要一把钥匙吗?所以,如果你通过密钥加入,你应该拥有计算机ID和密钥(在这种情况下是ip)
我强烈建议使用带有自动增量的更简单的id,就像它自大型机(as400),iSeries等以来所做的那样。
答案 1 :(得分:1)
我认为问题answer的Marc_s'When not to use surrogate primary keys?可以指导我们
我会说以下标准必须 满足:
你的自然键必须绝对,积极, 允许无例外,唯一 (名称,社会保障等 数字等通常似乎是独一无二的 - 但实际上并非如此)
您的自然键应该与INT一样小,例如没有多少 超过4个字节(不要使用 VARCHAR(50)为你的PK,和 尤其不适用于您的群集密钥 在SQL Server中!)
你的自然键应该是稳定的,例如永远不会改变(好吧,用ISO 国家代码,这几乎是给定的 - 除非像南斯拉夫或苏联这样的国家崩溃,或者像两个德国人团结一样 - 但这种情况非常罕见)
如果满足这些条件,您可以 考虑一个自然的关键作为你的PK - 但这应该是2%的例外 所有的表 - 不是常态。
所以我想你应该使用代理主键。如果您想要
因为你正在使用你指出的longip可能没问题。
答案 2 :(得分:1)
几乎每次你开始使用自然键时,你最后都会后悔。它的墨菲定律会发生一些事情。免除麻烦,只需添加ID列。
如果是自动增量,你不喜欢只使用uuid。 MySql有一个uuid函数,可以轻松实现。