构建一个可以占用无数个字段的MySQL数据库

时间:2013-06-28 14:11:46

标签: sql dynamic-columns

我正在构建一个MySQL驱动的网站,该网站将分析由各种客户分发的客户调查。通常,这些调查的结构相当一致,我们的大多数客户数据可以简化为相同的规范化数据库结构。

然而,每个客户都不可避免地最终会为其客户提供与我们其他客户无关的高度具体的人口统计问题。例如,虽然我们所有的客户都会询问客户满意度,但只有我们的汽车客户会询问客户是否知道如何驾驶手动变速箱。

到目前为止,我一直在为respondents表添加列,以查找所有常规人口统计信息,其中包含大量default null个。但是,随着我们添加更多客户端,很明显这将导致大量的列几乎总是为空。

有没有办法一贯地做到这一点?我宁愿在respondents表中保留尽可能多的标准化数据,因为我们已经为该表编写了导入脚本。我的一个想法是构建一个respondent_supplemental_demographic_info表,其中包含response_id,demographic_field,demographic_value列(因此手动传输示例可能变为:'ID999','can_drive_manual_indicator',true)。这可能会拥有无数的人口统计数据,但从处理和编程的角度来看,这将是令人难以置信的痛苦。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

对于具有键值对(字段ID,字段值)的表,不要因为效率低而堕落。

在您的情况下,我会为每个客户创建一个表。和描述这些表的元数据表(在单独的DB中)。使用这些元数据,您可以生成SQL等。具有许多空列也是绝对优越的。或复制,改编的脚本。它需要一些编程,其中应用程序使用元数据生成SQL,收集数据(没有客户特定的语义知识)并生成报告。

答案 1 :(得分:0)

您对此问题的解决方案称为实体属性值(EAV)。这个“unpivots”列,因此它们是表中的行,然后将它们绑定在一个视图中。

EAV结构学习如何处理有点棘手。它们需要更多的连接或聚合才能获得单个视图。而且,值的类型变得具有挑战性。通常有一个值列,因此所有内容都存储为字符串。当然,您可以使用不同类型的类型列。

它们也会占用更多空间,因为每一行都会重复实体ID(我认为这是response_id)。

虽然在所有情况下都不是主意,但它们适用于您描述的情况。您无限期地添加属性。您将快速运行单个表中允许的最大列数(通常在1,000到4,000之间,具体取决于数据库)。您还可以单独跟踪每列中的每个值 - 例如,如果在不同时间添加它们,您可以在进入时保留时间戳。

另一种方法是为每个客户端维护一个单独的表,然后使用其他一些进程将数据组合到一个公共数据结构中。