我将各种用户详细信息存储在MySQL数据库中。最初它设置在各种表中,这意味着数据与UserIds链接,并通过有时复杂的调用输出,以根据需要显示和操作数据。建立一个新系统,将所有这些表组合成一个相关内容的大表几乎是有意义的。
以下是我的一些表结构的示例:
编辑:到目前为止,我已经对所有答案进行了投票,它们都有基本上回答我问题的元素。
大多数表格具有1:1的关系,这是使它们非规范化的主要原因。
当这些表格的大部分可能保持空白时,如果表格跨越100多列,是否会出现问题?
答案 0 :(得分:57)
多个表有以下方式/案例帮助:
(a)如果不同的人正在开发涉及不同表格的应用程序,那么拆分它们是有意义的。
(b)如果您想为不同的人提供不同类型的权限,以便对数据收集的不同部分进行分割,则拆分它们会更方便。 (当然,您可以查看定义视图并对其进行适当授权)。
(c)为了将数据移动到不同的地方,特别是在开发过程中,使用表格来缩小文件大小可能是有意义的。
(d)在为单个实体的特定数据收集开发应用程序时,较小的足迹可能会让您感到舒适。
(e)这是一种可能性:你认为单个价值数据在未来可能会变成多个价值。例如信用额度是截至目前的单一值字段。但是明天,您可以决定将值更改为(日期,日期,信用值)。拆分表现在可能会派上用场。
我的投票将针对多个表格 - 数据被适当地分割。
祝你好运。答案 1 :(得分:32)
组合表称为非正规化。
它可能(或可能不)帮助进行一些查询(这会使很多JOIN
s)运行得更快,但代价是创建维护地狱。
MySQL
只能使用JOIN
方法,即NESTED LOOPS
。
这意味着对于驱动表中的每条记录,MySQL
在循环中的驱动表中找到匹配的记录。
查找记录是一项非常昂贵的操作,可能需要几倍于纯记录扫描的时间。
将所有记录移动到一个表中将帮助您摆脱此操作,但表本身会变大,表扫描需要更长的时间。
如果您在其他表中有大量记录,那么表扫描的增加可能会使按顺序扫描的记录的权益超重。
另一方面,维护地狱是有保障的。答案 2 :(得分:17)
他们都是1:1的关系吗?我的意思是,如果用户可能属于,例如,不同的用户级别,或者用户兴趣被表示为用户兴趣表中的多个记录,那么合并这些表将是不可能的。
关于规范化的先前答案,必须说数据库规范化规则完全忽视了性能,并且只关注什么是整洁的数据库设计。这通常是你想要实现的目标,但有时候为了追求绩效而积极地反规范化是有意义的。
总而言之,我想问的问题归结为表格中有多少字段,以及它们访问的频率。如果用户活动通常不是很有趣,那么出于性能和维护原因,总是将它放在同一记录上可能会很麻烦。如果某些数据(如设置)经常被访问,但只是包含太多字段,那么合并表也可能不方便。如果您只对性能提升感兴趣,可以考虑其他方法,例如将设置保持独立,但将它们保存在自己的会话变量中,这样您就不必经常查询数据库。
答案 3 :(得分:12)
这些表的所有是否都有1-to-1
关系?例如,每个用户行是否只在user_stats
或user_levels
中有一个对应的行?如果是这样,将它们组合成一个表可能是有意义的。如果关系不是 1 to 1
,那么将它们组合(非规范化)可能没有意义。
ETA:
如果您的关注是关于列太多,那么请考虑您通常一起使用的内容并将这些内容合并,剩下的就是其余内容在一个单独的表中(如果需要,可以是几个单独的表)。
如果你看一下你使用数据的方式,我猜你会发现80%的查询都会使用20%的数据,其余80%的数据只是偶尔使用。将经常使用的20%合并到一个表中,并将80%不经常使用的表留在单独的表中,您可能会有一个很好的妥协。
答案 4 :(得分:7)
创建一个大型表违反了关系数据库主体。我不会将它们全部合并到一个表中。您将获得重复数据的多个实例。例如,如果您的用户有三个兴趣点,那么您将拥有3行,并使用相同的用户数据来存储三个不同的兴趣。明确地采用多重“标准化”表格方法。有关数据库规范化,请参阅this Wiki页面。
修改强> 我更新了我的答案,因为你已经更新了你的问题......我现在更赞同我的初步答案......
这些细胞的很大一部分是 可能仍然是空的
例如,如果用户没有任何兴趣,如果你正常化,那么你就不会在该用户的兴趣表中有一行。如果你把一切都放在一个庞大的表中,那么你将拥有只包含NULL的列(显然很多)。
我曾在一家电话公司工作,那里有大量的表,获取数据可能需要很多连接。当从这些表中读取的性能至关重要时,创建的过程可以生成一个平面表(即非规范化表),该表不需要报告可能指向的连接,计算等。然后将这些内容与SQL Server代理一起使用,以便以特定间隔运行作业(即每周运行一次的某些统计信息,依此类推)。
答案 5 :(得分:7)
为什么不使用与Wordpress相同的方法,通过让用户表具有每个人都拥有的基本用户信息,然后添加“user_meta”表,该表基本上可以是与用户ID关联的任何键,值对。因此,如果您需要为用户查找所有元信息,您只需将其添加到查询中即可。如果登录等事情不需要,您也不必总是添加额外的查询。这种方法的好处还使您的桌子可以向用户添加新功能,例如存储他们的Twitter句柄或每个人的兴趣。您也不必处理关联ID的迷宫,因为您有一个规则所有元数据的表,您将其限制为仅一个关联而不是50个。
Wordpress专门用于允许通过插件添加功能,因此允许您的项目更具可扩展性,并且如果您需要添加新功能,则不需要完整的数据库大修。
答案 6 :(得分:3)
我认为这是“依赖”的情况之一。拥有多个表格更清晰,理论上可能更好。但是当你必须加入6-7个表来获取有关单个用户的信息时,你可能会开始重新考虑这种方法。
答案 7 :(得分:1)
我想说这取决于其他表格的真正含义。 user_details是否包含超过1个/用户等等。 标准化的最佳级别最适合您的需求取决于您的需求。
如果你有一个表具有良好的索引可能会更快。但另一方面可能更难维护。
对我而言,您似乎可以跳过User_Details,因为它可能与用户的关系是1比1。 但其余的可能是每个用户很多行?