私は、製品、テーブル、列、行の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でクエリを実行することもできます。そして、テーブルがこの使用のために粗い場合は、多分あなたは行でそれを行うことができます。
この質問に答える前に、私は個人的に例を見る必要があります。特に、「テーブル」はデータベース世界でこのような過負荷状態にあるためです。 –
この質問のテーブルは、SQLデータベースのテーブルと同じです。これは、一連の列によって定義され、データの行を持ちます。このようなテーブルの一例は[Here](http://www.teach-ict.com/gcse_new/databases/terminology/miniweb/images/table.gif)です。 –