2016-05-15 6 views
1

私は、各製品がテーブルのセットを持つことができる一連の製品を含むデータベースを必要とするアプリケーションを持っています。エンドユーザーは、新しい製品を追加して、製品の新しいテーブルを定義できる必要があります。したがって、各テーブルには、ユーザーによって指定された一連の列があります。ユーザーは、データの行で表を埋めることができます。各表は正確に1つの製品に属します。Datomicテーブルモデル

エンドユーザーは、特定の時点(特定のトランザクション時)に表を表示することもできます。

これをDatomicでスキーマ化すると、クエリをできるだけ効率的にすることができますか?

+0

この質問に答える前に、私は個人的に例を見る必要があります。特に、「テーブル」はデータベース世界でこのような過負荷状態にあるためです。 –

+0

この質問のテーブルは、SQLデータベースのテーブルと同じです。これは、一連の列によって定義され、データの行を持ちます。このようなテーブルの一例は[Here](http://www.teach-ict.com/gcse_new/databases/terminology/miniweb/images/table.gif)です。 –

答えて

1

私は、製品、テーブル、列、行の4つのエンティティタイプを使用します。

製品とテーブルとの間の関係を最もよく:table/product一対一ref属性によって処理されるが、ref属性も働くことができる:product/tables多成分(後者は1対多の関係を強制しません)。

同様に、:column/tableまたは:table/columnsのいずれかの属性を使用します。私も:column/name文字列属性を持っていて、おそらく:column/type列挙型属性を持っています。

最も難しいのは、行をモデル化することです。

1つの魅力的な解決策は、列ごとに属性を作成することです。実際には、Datomic属性はそのような動的使用を意図していません。特に、スキーマ属性は、ピアのキャッシュに格納されます。これは、大きくなることを意味しません。 (私はこれについて間違っている可能性があり、そうDatomicチームの誰かが確認できれば、それは素晴らしいことだ。)

代わりに、私は数十、再利用可能な:row/cell-0:row/cell-1:row/cell-2など「セルの位置の属性を持っているでしょうすべてのテーブルで共有されます。各実際の列は、1つの:column/position属性によって作成時にマップされます。

行に複数のデータ型を含めることができますが、それはもう少し難しいので、基本的に各(型、位置)ペアの属性を作成する必要があります。

各行は基本的に:row/table属性と上記のセル位置属性で構成されています。

は、ここでは、あなたのDatomicデシベルに対して直接データログを持つテーブルを照会したい場合は、テーブル全体に上記のすべてはのみ有用であることを

[: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]] 

注意を読み聞かせデータログのクエリです。しかし、テーブルをシリアライズしてブロブとして保存することもできます。特に小さい場合はテーブルをシリアル化してください。後でBLOBを取り出し、逆シリアル化してから、Datalogでクエリを実行することもできます。そして、テーブルがこの使用のために粗い場合は、多分あなたは行でそれを行うことができます。

+0

行をモデリングするのはまさに私が立ち往生したものでした。 –

関連する問題