数据库:建模电子表格的最佳方式

时间:2008-10-26 17:41:05

标签: spreadsheet database-design

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

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

您能想到更好的电子表格建模方法吗?我的方法允许将数据存储为String。我担心生成CSV文件太慢了。

5 个答案:

答案 0 :(得分:4)

从关系角度来看:

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

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

答案 1 :(得分:3)

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

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

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

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

有时候我希望Celko有一个SO账号。

答案 2 :(得分:2)

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

Entity-Attribute-Value - Wikipedia

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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