Mysql 数据库设计,可变列数

Mysql 数据库设计,可变列数,mysql,sql,database-design,Mysql,Sql,Database Design,我有一个简单的应用程序,其中用户将数据提交到一个表中 目前,用户可以向3个字段传递值。我试图找到一种解决方案,根据用户创建的描述列表,描述列的数量可能会有所不同 到目前为止,我考虑过: 用户输入表有许多可为空的描述 字段,比如1-15,从而限制了描述的数量 用户可以定义为15的字段。这个解决方案很容易实现 但是,查询和维护仅限于一组字段。 (总体而言,这是一个可行且可接受的解决方案吗?) 创建一个表,其中每行对应一个描述 进入。这将允许用户创建无限数量的 描述字段,但是存储每个输入将代替 1行现

我有一个简单的应用程序,其中用户将数据提交到一个表中

目前,用户可以向3个字段传递值。我试图找到一种解决方案,根据用户创建的描述列表,描述列的数量可能会有所不同

到目前为止,我考虑过:

  • 用户输入表有许多可为空的描述 字段,比如1-15,从而限制了描述的数量 用户可以定义为15的字段。这个解决方案很容易实现 但是,查询和维护仅限于一组字段。 (总体而言,这是一个可行且可接受的解决方案吗?)
  • 创建一个表,其中每行对应一个描述 进入。这将允许用户创建无限数量的 描述字段,但是存储每个输入将代替 1行现在取n行,其中n是链接描述的计数 到当前描述列表。用户可以自由选择金额 但是,查询和维护列的数量并不是那么容易
  • 我当前的表格如下所示:

    CREATE TABLE `user_input` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `description_list_id` int(11) NOT NULL,
    `description1` int(11) NOT NULL,
    `description2` int(11) NOT NULL,
    `description3` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    还有其他解决方案吗?

    肯定是选项2。在这样的场景中,normalizeAING始终是最好的选择。您认为这需要更多的工作,这是正确的,但您正在克服不可避免的问题,因为您需要超过15种描述。

    第二种解决方案在灵活性方面更可取。如果明天需要在第一个解决方案中添加更多描述字段,则需要修改表和代码来管理它

    第二个解决方案现在可能需要更多的工作,但它将处理2个,比如200个描述


    第一种方法对于一个小问题来说是一个快速而肮脏的解决方案,如果你有时间尝试新的东西,第二种方法也是一个很好的练习

    +1当
    description 3
    是唯一填写的内容时,这也是不可避免的问题。假设您的description\u list\u id是某个名为“description\u list”的表的外键,那么您所描述的基本上是表用户和description\u list之间的N对N关系,以及附加的数据(description字段)。请注意,这可能更容易查询。例如,考虑如何查询您或数据库以查找“有多少用户回答了description\u list\u id=3的description=12”。您将得到一个糟糕的WHERE子句,看起来像:“description1=12或description2=12或…”。解决方案#2使提取摘要变得更容易。说明#列表#id是一个外键,但它存储了用户查看提交的数据时显示给用户的值(以便不显示“说明1”)。好的,假设我使用选项2。如何检索数据?有没有办法用解决方案nr 2在一次查询中检索数据库中曾经是1行的内容?您可以对查询中的数据进行反规范化:
    选择case when desc_seq_id=1,然后选择desc.desc_text end as desc1;case when desc_seq_id=2,然后选择desc.desc_text end…
    ,但最好是以有序列表的形式检索多行,然后遍历前端应用程序中的行。或者采用描述的可怕方法什么是
    description\u list\u id
    以及为什么描述列是整数?还要注意,如果使用选项#1,假设大多数用户只使用一个描述,那么每行将浪费14个字节(如果VARCHAR length>28,则为28个字节)。如果您选择更多的列,这可能会非常昂贵。