mysql – 基于现有列作为主键的代理键的可行性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 基于现有列作为主键的代理键的可行性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2740字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 基于现有列作为主键的代理键的可行性](/upload/InfoBanner/zyjiaocheng/896/2e69269feb914bdd89e2e05f8cdc6f58.jpg)
我正在为数据库设计架构,并对主键选择有疑问.我们现在正在查看的表中没有任何自然键可用,尽管我的团队有兴趣使用更多“可读”键来查看表之间的关系更容易一些.
当前提出的解决方案是使主键成为现有列的随机数.例如:我们有一个PERSON表,其中有一个Name列. PersonID是主键,它是Name的一些数字.所以名为Alex的人有PersonID Alex1.
我们正在寻找可能有数千个条目.这会阻碍使用字符串作为主键的性能吗?有没有理由使用或不使用更“可读”的密钥?
可能值得注意的是,我们的团队习惯于工作的大多数系统只有少数几个表,在这些表中反弹并直接看到关系并不太困难.我们要绘制的这个项目知道将有十几个可能有几十个表.此外,我们使用MySQL,并且经常有足够的团队成员使用PHPMyAdmin直接输入数据,我认为这是推动拥有可读密钥的主要原因.
解决方法:
你可以这样做 – 但我不会.原因如下:
我通常会尽量避免使用“人类有意义”的值作为键 – 因为人类可能会决定他们希望价值成为别的东西.由于你的关键部分是人类有意义的价值,因此会有改变它的诱惑.
例如,“亚历克斯”决定他们想要使用他们的全名“Alexos”.您是将PK更改为“Alexos1”,还是将其保留为“Alex1”?通过级联更新,更新PK并不困难 – 但是,如果有很多外键绑定它,它可能会导致锁定问题.
接下来,您要添加到名称中的“随机数”以创建密钥.
>如果它是真正随机的,你必须检查碰撞,并设置一些上限(如果在与特定名称绑定时耗尽可能的值,则可能必须更改).
>如果它不是随机的,而是以某种方式与基础数据相关联,则可能必须计算它(例如,如果下一个“Alex”应该是“Alex2”).
>如果它实际上是唯一的(例如:如果你有一个自动增量整数列,uid,它实际上是唯一的,你将name和uid列结合起来制作name_id),它很容易构建(只要名称列可以在它的末尾有数字 – 如果可以的话,那么可能再次发生碰撞),但是:
>你可能会开始失去简单的联系 – 如果你有“Alex326”,“Alex3156”和“Alex12581”,你可能会达到这样的程度,即两个表中的数字3156匹配就像定位一样简单“Alex3156”.
>这太过分了,因为uid已经是一个非常好的关键价值.
您的团队的最大优势是能够在两个不同的列表中连接数据行.如果您正在处理Excel,这可能有意义;在SQL数据库中,它确实没有.如果要匹配两个不同表的行,只需运行一个连接它们的查询.
我在上面提到了一些潜在的“缺点”.其中一些与更通用的数据库设计问题相关联.
>如果名称值发生变化,是否更改密钥以及创建名称和uid列之外的组合密钥的问题 – 实际上都需要对数据进行非规范化.
>字符串值键几乎总是占用比唯一整数键更多的磁盘空间.这将影响表格上的每个索引;他们也会消耗更多空间.而且,数据占用的空间越多,每个查询运行所需的时间就越多. (诚??然,在实践中,使用相对较小的表格,密钥的大小可能不会对您的用户造成明显的差异;但是在几千行中,差异就在那里).
我倾向于在表中使用自动增量整数ID,并让用户通过加入相关表的查询来回退数据,而不是依赖于人们可以在单独的表转储中“注意”的键.如有必要,为它们创建视图以隐藏连接.
最初,这可能会使PHPMyAdmin的数据输入更加困难.但是,用户将适应 – 例如,如有必要,将ID复制并粘贴到链接记录中.设计一个数据库,使数据输入任务变得更容易,通常不是一个很好的策略 – 在大多数情况下,首先将数据放在数据库中所需的好处更多的是一旦使用它就可以使用它.在您的系统中,而不仅仅是输入它.
内容总结
以上是互联网集市为您收集整理的mysql – 基于现有列作为主键的代理键的可行性全部内容,希望文章能够帮你解决mysql – 基于现有列作为主键的代理键的可行性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。