2016-05-15 25 views
1

我有一個應用程序需要一個數據庫包含一組產品,其中每個產品可以有一組表。最終用戶應該能夠添加新產品併爲產品定義新表格。所以每個表都有一組由用戶指定的列。用戶可以使用數據行填充表格。每張表只屬於一種產品。Datomic表模型

最終用戶還應該能夠查看錶格在特定時間點(在某個事務處)。

我該如何去爲Datomic製作一個模式,以便查詢它會盡可能高效?

+0

我個人需要查看例子才能回答這個問題,特別是因爲'table'在數據庫世界中是一個超載的術語。 –

+0

此問題中的表格與SQL數據庫中的表格相同。它由一組列和數據行定義。 [這裏](http://www.teach-ict.com/gcse_new/databases/terminology/miniweb/images/table.gif)就是這樣的一個例子。 –

回答

1

我會去4種實體類型:產品,表格,列和行。

產品和表格之間的關係最好由:table/product to-one ref屬性處理,但多對一的組件ref屬性也可以工作(後者不強制執行一對多關係)。

同樣,我會使用:column/table:table/columns屬性。我還會有一個:column/name字符串屬性和一個:column/type枚舉屬性。

最難的部分是對行進行建模。

一個誘人的解決方案是隻爲每列創建一個屬性 - 我實際上認爲這是個壞主意,Datomic屬性不適合這種動態使用。特別是,架構屬性存儲在Peer上的緩存中,並不意味着增長很大。 (我可能是錯的這一點,所以這會是很好,如果有人在Datomic團隊可以確認。)

相反,我將有一個幾十可重複使用的:row/cell-0:row/cell-1:row/cell-2等「單元位置」屬性,它們在所有表格中共享。每個實際列將在創建時被映射到一對一的:column/position屬性。

如果行可以有多種數據類型,那就更困難了,你必須爲每個(類型,位置)對創建一個屬性。

然後每一行基本上由:row/table屬性和上面的單元格位置屬性組成。

這裏有一個數據記錄的查詢,將讓你讀整個表

[:find ?row ?column-name ?val :in $ ?table :where 
[?column :column/table ?table] 
[?row :row/table ?table] 
[?row ?pos ?val] 
[?column :column/position ?pos] 
[?column :column/name ?column-name]] 

注意,上述所有的僅僅是有用的,如果您想直接與數據記錄查詢表對你Datomic分貝。但是,將表格序列化並將它們存儲爲blob也可以,尤其是如果它們很小的話;稍後,您將blob反序列化,然後您可以使用Datalog進行查詢。如果表格要粗略的用於這個用途,也許你可以用行來做。

+0

對行進行建模正是我所堅持的,感謝這些想法! –