【问题标题】:Database : best way to model a spreadsheet数据库:为电子表格建模的最佳方法
【发布时间】:2019-04-03 09:37:17
【问题描述】:

我正在尝试找出对电子表格进行建模的最佳方法(从数据库的角度),同时考虑到:

  • 电子表格可以包含可变数量的行。
  • 电子表格可以包含可变数量的列。
  • 每一列可以包含一个值,但其类型未知(整数、日期、字符串)。
  • 生成包含数据的 CSV 文件必须简单(且高效)。

我正在考虑类似的事情:

class Cell(models.Model):
    column = models.ForeignKey(Column)
    row_number = models.IntegerField()    
    value = models.CharField(max_length=100)

class Column(models.Model):
    spreadsheet = models.ForeignKey(Spreadsheet)
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=100)

class Spreadsheet(models.Model):
    name = models.CharField(max_length=100)
    creation_date = models.DateField()

您能想出一种更好的电子表格建模方法吗?我的方法允许将数据存储为字符串。我担心生成 CSV 文件太慢。

【问题讨论】:

  • 每个数据库是否有多个电子表格?
  • 是的,但我们可以简化它,假设每个数据库只有一个电子表格。谢谢。

标签: spreadsheet database-design


【解决方案1】:

从关系的角度来看:

Spreadsheet <-->> Cell : RowId, ColumnId, ValueType, Contents

行和列不需要是实体,但如果你愿意,你可以

【讨论】:

  • 这需要 PIVOT 才有用;对于新用户来说,旋转是复杂且难以理解的。如果您的数据库没有 PIVOT 功能,那么您的应用程序将无法扩展。 避开 Knuth 冷酷的目光
  • @[Will]:没有人说在关系数据库中为电子表格建模会很容易;-)
  • 要生成 CSV 文件,您不需要旋转。取而代之的是“SELECT contents FROM cell ORDER BY RowId, ColumnId”,当 ColumnId 跳跃超过 1 时填充额外的列,当 RowId 跳跃超过 1 时填充额外的行
【解决方案2】:

数据库不是为此而设计的。但是您可以尝试几种不同的方法。

做这件事的天真方法是做一个表来统治他们的版本。也就是说,创建一个巨大的通用表,所有类型都是 (n)varchars,它有足够的列来覆盖任何可预见的电子表格。然后,您需要第二个表来存储关于第一个表的元数据,例如 Column1 的电子表格列名称是什么,它存储的类型(以便您可以输入和输出)等。然后您需要运行触发器插入检查传入的数据和元数据以确保数据没有损坏等。如您所见,这种方式是一个完整的集群。我会尖叫着逃跑。

第二个选项是将您的数据存储为 XML。大多数现代数据库都有 XML 数据类型,并且在查询中支持 xpath。您还可以使用 XSD 提供某种数据验证,并使用 xslts 将该数据转换为 CSV。我目前正在对配置文件做类似的事情,到目前为止效果还不错。目前还没有关于性能问题的消息,但我相信 Knuth 会解决这个问题。

第一个选项可能更容易搜索并且可以更快地从中检索数据,但第二个选项可能更稳定并且更容易编程。

在这种情况下,我希望 Celko 有一个 SO 帐户。

【讨论】:

    【解决方案3】:

    您可能想研究 EAV(实体-属性-值)数据模型,因为它们正试图解决类似的问题。

    Entity-Attribute-Value - Wikipedia

    【讨论】:

    【解决方案4】:

    最佳解决方案很大程度上取决于使用数据库的方式。尝试找到几个您期望的顶级用例,然后决定设计。例如,如果没有用例从数据库中获取某个单元格的值(数据总是在行级别加载,甚至在行组中加载),那么就不需要这样存储“单元格”。

    【讨论】:

    • 它将用于基于 Web 的 MS Excel 克隆。用户主要是编辑单元格,但添加/删除行和列也是常见的操作。另外,用户可以随时以 CSV 格式下载数据。
    【解决方案5】:

    这是一个很好的问题,需要很多答案,具体取决于您的处理方式,我很乐意与您分享意见。 这个话题是我们在 Zenkit 上搜索过的各种话题之一,我们甚至写了一篇关于它的文章,希望您能对此发表意见:https://zenkit.com/en/blog/spreadsheets-vs-databases/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多