我的表格中有 40 多列,我必须添加更多字段,例如当前城市、家乡、学校、工作、大学、大学……
将为许多匹配的用户提取这些用户数据,这些用户是共同的朋友(与其他用户朋友一起加入朋友表以查看共同的朋友)并且未被阻止并且还不是该用户的朋友。
上面的请求有点复杂,所以我认为最好将额外的数据放在同一个用户表中以快速访问,而不是向表中添加更多联接,这会进一步减慢查询速度。但我想听听你对此的建议
我的朋友告诉我添加额外的字段,这些字段不会作为序列化数据在一个字段上进行搜索。
实体关系图图:
- 我当前的表:https://i.stack.imgur.com/KMwxb.png
- 如果我加入更多表:https://i.stack.imgur.com/xhAxE.png
一些建议
- 这个表和列没有任何问题
- 遵循这种方法MySQL:优化具有大量列的表- 将额外字段序列化为一个不可搜索的字段
- 创建另一个表并将大部分数据放在那里。 (如果我已经有 3 个或更多表要加入来提取用户的记录(例如朋友、用户、检查共同的朋友),那么连接会变得更加困难
像往常一样 - 这取决于。
首先,有一个MySQL 可支持的最大列数,而你并不是真的想到达那里。
其次,如果您有很多带有索引的列,则插入或更新时会对性能产生影响(尽管我不确定这在现代硬件上是否重要)。
第三,大表通常是所有看似与核心实体相关的数据的垃圾场;这很快就会使设计变得不清楚。例如,您呈现的设计显示了 3 个不同的“状态”类型字段(status、is_admin 和 fb_account_verified) - 我怀疑应该有一些业务逻辑将它们链接在一起(例如,管理员必须是经过验证的用户),但是您的设计不支持这一点。
这可能是问题,也可能不是问题——它更多的是一个概念、架构/设计问题,而不是性能/是否有效。但是,在这种情况下,您可以考虑创建表来反映有关帐户的相关信息,即使它没有x对多关系。因此,您可以创建“user_profile”、“user_credentials”、“user_fb”、“user_activity”,所有这些都由 user_id 链接。
这使得它更加整洁,如果您必须添加更多与 facebook 相关的字段,它们不会悬在表格的末尾。但它不会使您的数据库更快或更可扩展。连接的成本可能可以忽略不计。
无论您做什么,选项 2(将“很少使用的字段”序列化为单个文本字段)都是一个糟糕的主意。您无法验证数据(因此日期可能无效,数字可能是文本,非空值可能会丢失),并且“where”子句中的任何使用都会变得非常慢。
流行的替代方案是“实体/属性/值”或“键/值”存储。此解决方案有一些好处 - 即使您的架构发生更改或在设计时未知,您也可以将数据存储在关系数据库中。然而,它们也有缺点:很难在数据库级别验证数据(数据类型和可为空性),很难使用外键关系与其他表建立有意义的链接,并且查询数据可能变得非常复杂 - 想象一下查找所有记录状态为 1、facebook_id 为空且注册日期大于昨天的记录。
鉴于您似乎知道数据的架构,我认为“键/值”不是一个好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)