Mysql 有多少数据库表列太多?

Mysql 有多少数据库表列太多?,mysql,database-design,entity-attribute-value,Mysql,Database Design,Entity Attribute Value,我接管了一个项目的开发,该项目的用户表有30多列。糟糕的是,对列的更改和添加不断发生 这是不对的 我是否应该将额外的字段作为值移动到第二个表中,并创建存储这些列名的第三个表 user id email user_field id name user_value id user_field_id user_id value 这实际上取决于你要做什么。不要走关键/价值路线。SQL不是为处理它而设计的,它将使从数据库中获取实际数据成

我接管了一个项目的开发,该项目的用户表有30多列。糟糕的是,对列的更改和添加不断发生

这是不对的

我是否应该将额外的字段作为值移动到第二个表中,并创建存储这些列名的第三个表

user
    id
    email

user_field
    id
    name

user_value
    id
    user_field_id
    user_id
    value
这实际上取决于你要做什么。

不要走关键/价值路线。SQL不是为处理它而设计的,它将使从数据库中获取实际数据成为一种自我折磨的练习。(示例:索引不起作用。当您必须加入以获取所加入的数据时,加入会非常有趣。这种情况还会继续。)

只要数据规范化到一个合适的级别,就不会有太多的列


编辑:需要明确的是,有些问题只能通过键/值路由来解决。“太多的栏目”不是其中之一。

很难说多少就是太多。这真的很主观。我认为您应该问的问题不是“是否有太多的列?”,而是“这些列属于这里吗?”我的意思是,如果您的用户表中有一些列不一定是用户的属性,那么它们可能不属于这里。例如,如果您有一组列汇总用户的地址,那么您可能会将这些列拉入带有FK into user的地址表中


如果可能的话,我会避免使用键/值表。这看起来似乎是一种简单的方法来扩展东西,但从长远来看,这确实是一种痛苦。如果您发现您的模式正在非常一致地改变,那么您可能需要考虑将某种更改控制放在适当的位置,以便只对必要的更改进行修改,或者转移到另一种更好地支持无模式存储的技术,如MungDB或CouCHDB的NOSQL。

< P>这通常被称为“EAV”,这是否适用于您的数据库取决于许多因素:


太多的列并不是其中之一。

如果表中的更改和添加能够准确反映业务需求中的更改,那么这并不是一件坏事。

如果更改和添加是连续的,那么您可能需要坐下来更好地定义需求。现在我不能说30列是否太多,因为这取决于它们的宽度,以及它们是否应该移动到相关的表中。例如,如果您有像phone1、phone2、Phone3这样的字段,那么您就有一个混乱的情况,需要将其拆分为用户电话的相关表。或者,如果您的所有列都很宽(并且您的表总宽度比数据库存储数据的页面都宽),并且查询不经常需要某些列,那么在具有一对一关系的相关表中可能会更好。除非您有实际的性能问题,否则我可能不会这样做


然而,从可维护性和性能的角度来看,在所有可能的选择中,您描述的EAV模型是最差的。很难针对这个模型编写合适的查询

+1。将字段名放在一个单独的表中会让您感到非常困难。是的,如果将所有值移动到其他表行中,我想尝试请求所有值会很痛苦。我怀疑是否需要此应用程序中的大部分内容。但话说回来,我只是个受雇的程序员。