MySQL:数据库结构选择-大数据-重复数据或桥接
我们有一个90GB的MySQL数据库,其中包含一些非常大的表(超过100万行)。我们知道这不是最好的DB引擎,但这不是我们现在可以改变的 在计划进行一次认真的重构(性能和标准化)时,我们正在考虑几种重构表的方法 数据流/存储当前以以下方式完成:MySQL:数据库结构选择-大数据-重复数据或桥接,mysql,bigdata,schema,Mysql,Bigdata,Schema,我们有一个90GB的MySQL数据库,其中包含一些非常大的表(超过100万行)。我们知道这不是最好的DB引擎,但这不是我们现在可以改变的 在计划进行一次认真的重构(性能和标准化)时,我们正在考虑几种重构表的方法 数据流/存储当前以以下方式完成: 我们有一个名为articles的表,一个名为article_authors的连接表和一个名为authors的表 一个作者可以有1..n个名字,1..n个姓氏,1..n封电子邮件 每个作者都有一个唯一的父级(unique_author),除非该作者是父级
- 我们有一个名为articles的表,一个名为article_authors的连接表和一个名为authors的表
- 一个作者可以有1..n个名字,1..n个姓氏,1..n封电子邮件
- 每个作者都有一个唯一的父级(unique_author),除非该作者是父级
- 获取给定文章的作者名、姓氏和电子邮件
- 获取名为John Smith的作者的唯一authors.id
- 从名为约翰·史密斯的作者那里获取所有文章
当前模式可能是最好的。中间的表是多对多映射表,对吗?通过以下提示可以提高效率: 重写#1闻起来像“过度规范化”。一个巨大的浪费 重写2有一些优点。让我们谈谈电话号码而不是姓氏,因为一个人有多个电话号码(家庭、工作、手机、传真)是很常见的,但不太可能有多个名字。(好吧,好吧,有些作者有笔名) 在手机里放一堆电话号码是不现实的;最好有一个单独的电话号码表,将其链接回属于谁的电话号码。这将是1:多。(忽略两个人共用同一个电话号码的情况——因为共用一所房子,或者因为在同一家公司工作。让号码显示两次。) 我不明白你为什么要把姓和名分开。“J.K.罗琳”的“名字”是什么?我认为把名字分成姓和名是没有用的 一个作者将有一个唯一的“id”
MEDIUMINT UNSIGNED AUTO_INCREMENT
适用于这种情况。“J.K.罗琳”和“JK罗琳”都可以链接到相同的id
更多
我认为每个作者都有一个唯一的id
是非常重要的。然后可以使用id
链接到书籍等
您已经指出,将不同的拼写映射到单个id是一个挑战。我认为这本质上应该是一个单独的任务,有单独的表。你问的就是这个任务
也就是说,将数据库拆分,并将头脑中的任务拆分为:
- 一组表格,其中包含一些东西,可以帮助从外部提供的不一致信息推断出正确的
作者id
- 已知
唯一的一组表作者id
altertable
和createtable
如果提供者的拼写是一致的,那么带有(provider\u id
,full\u author\u name
,author\u id
)的表可能是一个好的第一个切分。但这并不能处理拼写、新作者和新提供者的变化。我们正进入灰色地带,很快需要人为干预。更糟糕的是两个同名作者的问题
因此,在设计算法时,假设简单数据可以从数据库轻松高效地获得。从这一点上,模式设计将有点容易流动
这里还有一个提示。。。对于难以匹配的情况,某种程度的“暴力”是可以接受的。大多数情况下,您可以非常高效地将名称字符串映射到作者id
从一个表中提取100行可能更容易,它们在应用程序代码中的算法中进行按摩。(SQL对于算法来说相当笨拙。)如果你想缩小电子邮件的大小,你也可以考虑将电子邮件地址分成两部分:“jkrowling@”+“gmail.com”。您可以在一个表中存储常见的电子邮件域,但过度规范化是一个问题。。。