2008-10-26 110 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賬戶。