【问题标题】:Reducing the number of table columns减少表列数
【发布时间】:2012-08-28 18:56:17
【问题描述】:

我正在尝试将庞大的数据电子表格转换为数据库,以便更轻松地进行数据分析,但我遇到了列过多的问题。我已尽力了解规范化,但我很难将其应用于此用例。

场景

我们正在对矩形块执行 N 独立测量。测量包括:

  • 长度(或测量 0)
  • 宽度(或测量值 1)
  • 高度(或测量值 2)
  • 质量(或测量 3)
  • 颜色(或测量 4)
  • ...
  • 测量N

有超过 7000 个测量值(复杂的块)!测量有限制。如果一个块未能通过一次或多次测量,则重复所有测量以进行验证。如果再次失败,则认为该块失败。

这些块是序列化的,有数千个。

数据源

一个巨大的电子表格(表格)。这些字段是:块编号、长度、宽度、高度、质量、颜色、...、测量 N。每一行代表一次测试运行或所有测量的执行。由于我们有重新测试政策,因此可能会有多行结果来自同一块。

救命!

此源表似乎是一种直观的格式,但似乎不是数据库的最佳格式。起初我试图把它放在一个 SQLite 数据库中并遇到了 2000 列的限制。是的,我可以使用更多列重新编译 SQLite 或使用另一个数据库引擎,但这听起来更像是一个数据库设计问题。你有更好的设计理念吗?

附:抱歉这么久,但感谢您的阅读!

【问题讨论】:

  • 所有测量值的数据类型是否相同?也就是说,所有测量值都是整数,还是浮点数,还是小数?
  • 大多数测量值是浮点数,但有些是文本,例如颜色。如果有显着的好处,我想我可以根据它们的值格式将测量分成几组。在这个后处理应用程序中,最大性能并不像可访问性那么重要。
  • 您总是一次进行 7000 次测量,还是有时会停止测量?
  • 有些我们停止了。根据测量结果,某些故障可能会停止整个测试运行。

标签: database sqlite normalization


【解决方案1】:

听起来您需要一个MeasurementType 表来保存所有测量的名称以及您可能想要存储的有关测量的任何其他信息。

然后您将有一个 Measurement 表同时引用 MeasurementType 和电子表格所在的“原始”表(即带有 Block Number 列的表):

CREATE TABLE MeasurementType (
    MeasurementTypeId INTEGER PRIMARY KEY AUTOINCREMENT,
    MeasurementType TEXT NOT NULL);

CREATE TABLE OriginalTable (
    OriginalTableId INTEGER PRIMARY KEY AUTOINCREMENT,
    BlockNumber INTEGER NOT NULL);

CREATE TABLE Measurement (
    MeasurementTypeId INTEGER NOT NULL,
    OriginalTableId INTEGER NOT NULL,
    MeasurementValue,
    PRIMARY KEY (MeasurementTypeId, OriginalTableId),
    FOREIGN KEY (MeasurementTypeId) REFERENCES MeasurementType (MeasurementTypeId),
    FOREIGN KEY (OriginalTableId) REFERENCES OriginalTable (OriginalTableId));

【讨论】:

  • 这似乎是迄今为止最好的选择。我实现了它。查询似乎不如多列表选项直观,但这可能就是我。现在我需要找到一种更有效的方法来填充这个Measurement 表。我正在使用 Python 使用两个 forloops 填充表格,一个用于原始表格的行,一个用于原始表格的列,它不能很好地扩展到数千个块:)
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 2014-07-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2021-01-02
相关资源
最近更新 更多