我试图找出建模电子表格的最佳方式(从数据库的角度来看),考虑到:
我正在考虑类似的事情:
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文件太慢了。
答案 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(实体 - 属性 - 值)数据模型,因为他们正试图解决类似的问题。
答案 3 :(得分:1)
最佳解决方案在很大程度上取决于数据库的使用方式。尝试找到您期望的几个主要用例,然后决定设计。例如,如果没有用例从数据库中获取某个单元格的值(数据总是在行级别,甚至在行组中加载),则不需要存储“单元格”。< / p>
答案 4 :(得分:0)
这是一个好问题,需要您提供很多答案,具体取决于您的处理方式,我很乐意与您分享意见。 这个主题是我们在Zenkit中搜索的各种主题,我们甚至写了一篇文章,希望您对此发表看法:https://zenkit.com/en/blog/spreadsheets-vs-databases/