4

私は最近、データベースを設計する必要性に直面しています。初めてなので、基礎を固めるためにアドバイスを求めたほうがいいと思いました。

ゴール

ストレージとクエリのために、オブジェクト (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: 私は基本的な理論に精通しており、リレーショナル データベースの実務経験は限られています。もちろん、これまでの専門的な経験はありません。私はこのテーマについて先週読んでおり、私の場合に関連すると思われるいくつかの概念 (正規化、外部キーなど) を把握しましたが、現時点ではまだ本を読んでいます。

4

1 に答える 1

1

これが初めてで、あなたのプロジェクトが見た目と同じくらい重要である場合は、基本を一から学ぶために時間と労力を費やしたいと思うかもしれません. CJ Date をはじめとする多くの著者が、基礎を説明する書籍やオンライン チュートリアルを提供しています。それらは素晴らしい作品です。

IT には、ほぼ完全なアドホクラシーによって支配されている分野がいくつかあります。そうではないデータベース設計。まず、EF Codd は約 42 年前に非常に確固たる数学的基礎に基づいて基礎を築きました。進歩はありましたが、後戻りはほとんどありません。そして、変化のための変化はほとんどありません。

同様に、SQL は、その長い寿命にわたって多くの安定性を享受してきました。

次に、データベース設計における試行錯誤は、非常にコストがかかる可能性があります。初心者が行った不幸な選択が、成果を上げられなかった数百万ドルのデータ投資に費やされたケースが数十件あります。

試行錯誤にはその場所があります。ヒントとコツにはその場所があります。SOに関する回答にはその場所があります。しかし、正式な学習も同様です。

于 2012-12-05T18:17:56.437 に答える