2008-10-26 200 views
2

我试图找出模型电子表格(但从数据库的点)的最佳方法,同时考虑到最好的办法:数据库:模型电子表格

  • 电子表格可以包含可变数量的的行。
  • 电子表格可以包含可变数量的列。
  • 每列可以包含一个单一的值,但其类型是未知的(整数,日期,字符串)。
  • 它必须很容易(和performant)才能生成一个包含数据的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文件速度太慢。

+0

你打算每个数据库有多个电子表格吗? – 2008-10-26 18:07:36

+0

是的,但我们可以简化它,假设每个数据库只有一个电子表格。谢谢。 – 2008-10-26 18:09:45

回答

2

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

Entity-Attribute-Value - Wikipedia

+0

示例[Entity-Attribute-Value Schema](http://www.databaseanswers.org/data_models/user_defined_hierarchies/index.htm) – ryan 2011-09-18 11:06:59

4

从关系的观点:

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

有行和列是实体没有要求,但你可以,如果你喜欢

+0

这需要PIVOT才有用;枢纽是复杂的,难以理解的新用户。如果你的数据库没有PIVOT功能,你的应用程序不会扩展其价值。 *避免Knuth的钢铁凝视* – Will 2008-10-26 19:05:18

1

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

3

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

令人生厌的做法是做一个表格来统治它们。也就是说,创建一个巨大的泛型表,所有类型都是(n)varchars,它具有足够的列来覆盖任何可预见的电子表格。然后,您需要第二张表来存储关于第一张的元数据,比如Column1的电子表格列名是什么,它存储的是什么类型(这样你可以投入和退出)等等。然后,你需要触发器来运行插入检查进入的数据和元数据以确保数据没有损坏等等等等等等。正如你所看到的,这种方式是一个完整的和完全的集群。我会从它尖叫。

第二个选项是将数据存储为XML。大多数现代数据库都具有XML数据类型,并支持查询中的xpath。您还可以使用XSD提供某种数据验证,并使用xslts将该数据转换为CSV。我目前正在做一些类似于配置文件的工作,目前它的工作状况良好。目前还没有关于性能问题的言论,但我相信Knuth就是这方面的。

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

这是这样的时候我希望Celko有一个SO账户。