mysql表,带40+;柱
我的表格中有40多列,我必须再添加几个字段,如:当前城市、家乡、学校、工作、大学、拼贴 这些用户数据将为许多匹配的用户提取,这些用户是共同的朋友(与其他用户朋友加入朋友表以查看共同的朋友),并且没有被阻止,并且还不是用户的朋友 上面的请求有点复杂,所以我认为最好将额外的数据放在同一个用户表中以快速访问,而不是向表中添加更多连接,这样会使查询速度减慢。但我想听听你的建议 我的朋友告诉我添加额外的字段,这些字段不会作为序列化数据在一个字段上搜索mysql表,带40+;柱,mysql,sql,optimization,multiple-columns,Mysql,Sql,Optimization,Multiple Columns,我的表格中有40多列,我必须再添加几个字段,如:当前城市、家乡、学校、工作、大学、拼贴 这些用户数据将为许多匹配的用户提取,这些用户是共同的朋友(与其他用户朋友加入朋友表以查看共同的朋友),并且没有被阻止,并且还不是用户的朋友 上面的请求有点复杂,所以我认为最好将额外的数据放在同一个用户表中以快速访问,而不是向表中添加更多连接,这样会使查询速度减慢。但我想听听你的建议 我的朋友告诉我添加额外的字段,这些字段不会作为序列化数据在一个字段上搜索 ERD图: 我当前的表格: 如果我加入更多表:
ERD图:
- 我当前的表格:
- 如果我加入更多表:
一些建议
像往常一样——这要看情况而定 首先,有一个问题,你并不真的想去那里 其次,如果有很多列带有索引,那么在插入或更新时会对性能产生影响(尽管我不确定这对现代硬件是否重要) 第三,大型表通常是所有似乎与核心实体相关的数据的倾卸场;这很快使设计变得不清晰。例如,您展示的设计显示了3个不同的“状态”类型字段(状态、is_admin和fb_account_verified)-我怀疑有一些业务逻辑应该将它们联系在一起(例如,管理员必须是经过验证的用户),但您的设计不支持这一点
这可能是也可能不是问题——它是一个概念、架构/设计问题,而不是一个性能/工作的事情。然而,在这种情况下,您可以考虑创建表来反映有关帐户的相关信息,即使它没有X对多关系。因此,您可以创建“UsSeriPrror”、“UsRe凭据”,“用户\u fb”、“用户\u活动”,均由用户\u id链接。 这使得它更整洁,如果你必须添加更多与facebook相关的字段,它们就不会挂在表的末尾。但这不会使你的数据库更快或更具可扩展性。连接的成本可能可以忽略不计
无论您做什么,选项2—将“很少使用的字段”序列化为单个文本字段—都是一个糟糕的主意。您无法验证数据(因此日期可能无效,数字可能是文本,而不是空值可能丢失),并且在“where”子句中的任何使用都会变得非常缓慢 一种流行的替代方法是“实体/属性/值”或“键/值”存储。此解决方案有一些好处-即使架构更改或在设计时未知,也可以将数据存储在关系数据库中。但是,它们也有缺点:很难在数据库级别验证数据(数据类型和可空性),很难使用外键关系与其他表建立有意义的链接,查询数据可能会变得非常复杂——想象一下,找到状态为1、facebook_id为空且注册日期大于昨天的所有记录鉴于您似乎知道数据的模式,我认为“键/值”不是一个好的选择。我有一个一般性的意见给您 想想看:如果你把超过10-12列的东西放在一个表中,即使把它们放在一个表中是有意义的,我猜你将在短期、长期和中期付出代价
你的3个表的方法似乎比1个表的方法要好,但是考虑把它们变成5-6个表,而不是3个表,因为你仍然可以。
将当前
,当前位置
,当前链接
从用户表
和工作
从用户配置文件
移动到一个新表中,主键为用户工作配置文件
将区域设置信息从user profile
移动到较新的USERPROFILELOCALE
信息,因为它本质上是通用的
是的,所有表中的所有泛型属性都应该是int
,而不是varchar
。
例如,City需要移动到一个名为LIST
\u的新表,其中包含cityid
的城市。
您的属性city
应该从varchar
更改为int
,并指向城市列表中的cityid
不要担心性能问题;您拥有的表越多,性能越好,因为您实际上是在将性能交给数据库提供程序,而不是自己掌握。我建议您运行一些测试。尝试两种方法并对其进行基准测试。没有人能给您一个明确的答案,因为您没有共享硬件配置、示例数据、示例查询、如何计划使用数据等。下面是一些您可能需要考虑的信息。 按预期使用数据库 关系数据库是专门为处理数据而设计的。正确使用它。正确编写后,在编写良好的架构中连接数据将表现良好。您可以使用EXPLAIN优化查询。您可以记录缓慢的查询并提高其性能。如果将所有内容都放在一个表中,数据库已经存在多年了性能,你不认为这会成为互联网上所有的热门话题,每个人都会这么做吗 发动机类型 随着行数的增长,插入将受到怎样的影响?您使用的是MyISAM还是InnoDB?您将受到最大的影响