1

我正在构建一个 MySQL 驱动的网站,该网站将分析由各种客户分发的客户调查。一般来说,这些调查的结构相当一致,我们客户的大部分数据都可以简化为相同的标准化数据库结构。

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

到目前为止,我一直在将respondents所有一般人口统计信息的列添加到表中,其中混入了很多default null'。但是,随着我们添加更多客户,很明显这最终会产生大量列几乎总是为空。

有没有办法始终如一地做到这一点?我宁愿在表中保留尽可能多的标准化数据,respondents因为我们的导入脚本已经为该表编写了。我的一个想法是构建一个respondent_supplemental_demographic_info表,其中包含列 response_id、人口统计字段、人口统计值(因此手动传输示例可能变为:'ID999'、'can_drive_manual_indicator'、true)。这可以容纳无限数量的人口统计字段,但从处理和编程的角度来看,使用起来会非常痛苦。有任何想法吗?

4

2 回答 2

0

不要沉迷于具有键值对(字段 id、字段值)的表,因为那是低效的。

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

于 2013-06-28T14:22:49.657 回答
0

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

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

它们还占用更多空间,因为实体 id 在每一行上重复(我认为这是response_id你的情况)。

尽管并非在所有情况下都适用,但它们适用于您所描述的情况。您正在无限期地添加属性。您将很快超过单个表中允许的最大列数(通常在 1,000 到 4,000 之间,具体取决于数据库)。您还可以分别跟踪每列中的每个值——例如,如果它们是在不同时间添加的,您可以在它们进入时保留时间戳。

另一种选择是为每个客户端维护一个单独的表,然后使用其他一些过程将数据组合成一个通用的数据结构。

于 2013-06-28T14:23:37.037 回答