4

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

  • 电子表格可以包含可变数量的行。
  • 电子表格可以包含可变数量的列。
  • 每列可以包含一个值,但其类型未知(整数、日期、字符串)。
  • 生成包含数据的 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 文件太慢。

4

5 回答 5

4

从关系的角度来看:

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

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

于 2008-10-26T18:20:01.277 回答
3

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

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

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

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

像这样的时候,我希望 Celko 有一个 SO 帐户。

于 2008-10-26T18:21:11.240 回答
2

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

实体-属性-值 - 维基百科

于 2008-10-26T18:19:41.900 回答
1

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

于 2008-10-26T18:20:03.023 回答
0

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

于 2019-04-03T01:37:17.927 回答