【问题标题】:Normalize database with thousand(s) of columns - design recommendations使用数千列规范化数据库 - 设计建议
【发布时间】:2016-12-20 22:45:22
【问题描述】:

背景:我正在协助的一个实验室将从小鼠身上采集少量唾液样本。每只老鼠都会被分配一个病人编号(第一个表的主键),与每只老鼠有关的特定信息将存储在这个表中(年龄、性别等)

每个唾液样本都将被分配一个唯一编号(主键,第 2 表),将引用患者编号,并使用他们的设备进行 1000 次扫描。我的任务是记录和存储每位患者每次唾液扫描的值(双倍),每次对患者进行采样(每周多次)。

理论上,我们希望所有的唾液采样都放在一个表中(我认为)。这将允许轻松生成人口平均值并经常更新。这也将有助于确定给定患者与相关人口平均值(相似的年龄、性别等)之间的差异。

我明显担心的是 1000+ 列在 MySQL 或任何数据库中都不是一个好的做法。我正在努力想出一种构建这些数据的好方法。 (也许每个患者都可以有自己的样本读数表,但生成针对整个人群的平均值似乎是有问题的。)

编辑 我没有具体说明,但每次扫描都使用特定波长的光,因此除了唯一的扫描编号外,扫描区域中的每个条目都应使用其特定波长进行引用。

【问题讨论】:

  • 我在您的描述中没有看到 1000 列。我看到 1000 行。
  • 每个样本都是一行而不是一列。
  • 你的最后一段说“1000+列”。 -- 不要那样做。

标签: mysql database-design normalization


【解决方案1】:

您的设计问题在于样本表包含所有扫描的数据(其中 1000 多个)。这就是你遇到问题的地方。

您需要 3 张桌子。一个给病人的,你已经描述过了。第二个用于样品,第三个用于扫描。

扫描表是扫描数据所在的位置。该表可能有 4 列 ScanId(主键)。 SampleId(引用样本表中一行的外键),序列号,因此您可以按时间顺序(如果需要)对样本进行所有扫描,以及扫描值。

样本表现在只有每个样本出现一次的数据值,例如样本日期。

您可以在需要时将所有三个表连接在一起。

【讨论】:

  • 我很清楚,在这种情况下,每个新的扫描实例都会向这个(扫描)表添加约 1000 个条目,每个条目引用回样本,每个样本引用回患者(但在样本表中)。在这种情况下,扫描表的行数将达到数十万(如果不是数百万),但良好的索引性能不会受到太大影响,而且我避免了过多的行数。这是对您所描述内容的准确评估吗?
【解决方案2】:

为什么不为此使用MongoDB?每只鼠标都有一个包含扫描数据的文档。

然后,您可以使用 MongoDB 的板载分析(或使用 Apache Spark 之类的工具)随意对数据进行切片和切块。

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2013-01-18
    • 2011-07-25
    • 2011-04-18
    • 2011-01-31
    • 1970-01-01
    • 2012-08-10
    • 2013-07-12
    相关资源
    最近更新 更多