私は最近、データベースを設計する必要性に直面しています。初めてなので、基礎を固めるためにアドバイスを求めたほうがいいと思いました。
ゴール
ストレージとクエリのために、オブジェクト (POD 構造はマルチマップと考えるのが最適です) を SQL データベースに格納したいと考えています。オブジェクトの内容とその「構造」は継続的に変更されます。データベースは、クエリと更新の両方で集中的にアクセスされます。
使用事例
まず、各オブジェクトには一意の識別子が必要です。
第二に、異なるタイプのオブジェクトが存在します。たとえば、ObjectA は ClassA のインスタンスです。ClassA は属性 A1、A2、A3 などを持つことができます。その結果、ObjectA はこれらの属性の値を持つことができます (必須ではなく、NULL を使用できます)。ただし、これらの属性はそれぞれ複数の値を持つ場合があります。つまりObjectA.A1="foo"
、 と ObjectA.A1="bar"
の両方が可能です。ClassA の属性の数は変更できます。簡単にするために、属性は追加のみ可能で、削除はできません。
第 3 に、属性は 1 つのクラスに固有のものではありません。つまり、ClassB のオブジェクトも属性 A1、A2 などを持つことができます。このようObjectB.A1="foo"
にすることも可能です。これで何かが変わるかどうかはわかりませんが、各属性がテーブルに対応するデザインではそうなるのではないかと感じています。
最後に、次の疑似クエリとアクションをサポートする必要があります。
- 属性 A1 が「bar」に等しいタイプ ClassA のすべてのオブジェクトを取得します。
- ObjectB のすべての属性を取得します。
- タイプ ClassA のオブジェクトに属性 A4 を追加します。
- 属性 A1="foobar"、A2="bar" を持つタイプ ClassC のオブジェクトを追加します。
制限事項
まず、データのシリアル化を避けたいので、1 つの列に複数の値があることは問題外です。データベースは正規化され、データ構造はアトミックである必要があります。データベースは非常に頻繁にクエリされるため、複雑なクエリ メカニズムを実装しようとして時間を無駄にする余裕はありません。私は車輪を再発明することになります(おそらく四角いものも)。
第 2 に、オブジェクトの内部構造に関する事前の知識を使用することはできません。これは、実行時にしか利用できないからです。たとえば、上記の使用例では、属性は事前にわかりません。そのため、各属性がテーブルである設計を考えましたが、そのような設定でオブジェクトのすべての属性を取得する方法がわかりません。
環境
SQLite 3.7、C++ を使用しています。
質問
記述された問題の要件を満たす、適切で柔軟なデータベース設計は何でしょうか?
有用な洞察や堅実な設計につながるヘルプ、ポインター、またはヒントは大歓迎です。
ありがとう!
ps: 私は基本的な理論に精通しており、リレーショナル データベースの実務経験は限られています。もちろん、これまでの専門的な経験はありません。私はこのテーマについて先週読んでおり、私の場合に関連すると思われるいくつかの概念 (正規化、外部キーなど) を把握しましたが、現時点ではまだ本を読んでいます。