MySQL:数据库结构选择 – 大数据 – 重复数据或桥接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL:数据库结构选择 – 大数据 – 重复数据或桥接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3227字,纯文字阅读大概需要5分钟。
内容图文
我们有一个90GB的MySQL数据库和一些非常大的表(超过100M行).我们知道这不是最好的数据库引擎,但这不是我们现在可以改变的.
我们正在考虑如何重构表格的几种方法,以便进行严格的重构(性能和标准化).
数据流/存储目前以这种方式完成:
>我们有一个名为articles的表,一个名为article_authors的连接表和一个表authors
>一位作者可以拥有1..n firstnames,1..n lastnames,1..n电子邮件
>每个作者都有一个唯一的父(unique_author),除非该作者是父作者
可能的数据查询方案如下:
>获取给定文章的作者名字,姓氏和电子邮件
>为一位名叫John Smith的作者获取独特的authors.id
>获取作者John Smith的所有文章
当前的数据库架构如下所示:
编辑:这个结构的主要问题是我们总是复制类似的given_names和last_names.
我们现在在两种不同的结构之间犹豫不决:
>大量的表,数据被拆分,并且有ID的连接.主表中没有重复:文章和作者.不确定这将如何影响性能,因为我们需要使用多个连接来检索数据,例如:
>数据在表article_authors(作者名字,姓氏和电子邮件备选方案)中具有重复条目的合理数量的表中分开,以减少表的数量和应用程序代码的复杂性.一位作者可以有10个替代方案,因此我们将在article_authors表中为同一作者提供10个条目:
解决方法:
目前的架构可能是最好的.中间表是一个多对多的映射表,对吗?遵循以下提示可以提高效率:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table
重写#1闻起来像“过度规范化”.一个很大的浪费.
重写#2有一些优点.让我们来谈谈phone_number而不是last_name,因为一个人拥有多个phone_numbers(家庭,工作,移动,传真)是相当普遍的,但不太可能有多个名字. (好吧,有些作者有假名).
将一堆电话号码放在一个小区中是不切实际的;最好是将一个单独的电话号码表链接回他们所属的人.这将是1:很多. (忽略两个人共用同一个电话号码的情况 – 由于共用一个房子,或者由于在同一家公司工作.让这个号码出现两次.)
我不明白你为什么要拆分名字和姓氏.什么是“J. K.罗琳”的“名字”?我建议将名称分为第一个和最后一个是没用的.
单个作者将具有唯一的“id”. MEDIUMINT UNSIGNED AUTO_INCREMENT很适合. “J. K. Rowling”和“JK Rowling”都可以链接到同一个id.
更多
我认为为每个作者提供一个唯一的ID是非常重要的.然后可以将id用于链接到书籍等.
您已经指出将不同的拼写映射到单个ID中具有挑战性.我认为这应该是一个单独的任务与单独的表.这是你要问的任务.
也就是说,拆分数据库拆分,并将您脑海中的任务拆分为:
>一组包含内容的表,以帮助从外部提供的不一致信息中推断出正确的author_id.
>一组表,其中author_id是唯一的.
(在MySQL意义上,这是一个还是两个DATABASE并不重要.)
mental split帮助您专注于两个不同的任务,并且它可以防止一些架构约束和混乱.你提出的模式都不是我提出的干净分割.
你的主要问题似乎是关于第一组表 – 如何将文本字符串(“JK Rawling”)转换为特定的id.在这一点上,问题首先是关于算法,其次是关于模式.
也就是说,表格应该设计为支持算法,而不是驱动它.此外,当新的提供程序带有一些奇怪的新文本格式时,您可能需要修改架构 – 可能为该提供程序的数据添加一个特殊的表.所以,不要担心在游戏的早期制作完美的架构;计划在下个月甚至明年运行ALTER TABLE和CREATE TABLE.
如果提供者的拼写是一致的,那么带有(provider_id,full_author_name,author_id)的表可能是一个很好的第一次切割.但这并不能处理拼写,新作者和新提供者的变化.我们正在进入灰色地带,很快就需要人为干预.更糟糕的是两个同名作者的问题.
因此,设计算法时假设可以从数据库轻松有效地获取简单数据.由此,模式设计将有点容易流动.
这里的另一个提示……对于难以匹配的情况,某种程度的“蛮力”是可行的.大多数情况下,您可以非常有效地将名称字符串轻松映射到author_id.
从表中获取一百行可能更容易,它们会在您的应用程序代码中按照算法进行操作. (SQL对算法来说相当笨拙.)
内容总结
以上是互联网集市为您收集整理的MySQL:数据库结构选择 – 大数据 – 重复数据或桥接全部内容,希望文章能够帮你解决MySQL:数据库结构选择 – 大数据 – 重复数据或桥接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。