4

[以前のタイトル:タグベースの組織方法論に関係構造を強制する方法はありますか?]

私にはいくつかのエンティティがあり、それらには一連の属性があります。一部の属性は、エンティティが持つことができる他の属性に影響を与えます。多くの属性はグループに編成され、エンティティは、特定のグループからの特定の数の属性、または場合によっては特定のグループからのある範囲の属性を持つように要求されることがあります。

データベースを使用して、要件、グループ化、除外など、この種のタグ間の関係をモデル化する方法はありますか、それともプログラムされた「ビジネスルール」でのみ可能ですか?理想的には、可能なタグとそれらの関係を簡単に構成できるようにし、それによって柔軟性を高めたいと思います。

私が検討した方法の1つは、タグと可能な関係を設定することです。そうすると、タグとタグが適用された関係のようなテーブルが得られますが、これはかなり脆弱なアプローチのようです。

それで、これはより厳密な方法で可能ですか?もしそうなら、私はそれについてどのように始めますか?

4

2 に答える 2

4

編集:他の属性の値にのみ依存して適用される変数属性の説明は、非リレーショナル、非正規化の設計です。RDBMSは、この種のデータを保存するための最良のソリューションではない場合があります。おそらくRDFは、このレベルの柔軟性を必要とするデータに適したソリューションになるでしょう。

RDBMSソリューションに関する私の以前の回答は次のとおりです。


Entity-Attribute-Value設計を使用して柔軟な属性をモデル化する人もいますが、これは構造化されていないことが多く、データの整合性の問題と戦うことになります。これは、実質的に無制限の数のエンティティサブタイプが必要な場合にのみ使用してください。

他の人は単一テーブル継承を使用します。この場合、すべてのサブタイプで使用されるすべての属性列を1つの非常に幅の広いテーブルに配置し、属性がサブタイプに関係のない行ではNULLのままにします。ただし、テーブルが大きくなりすぎる可能性があるため、これには制限があります。また、属性はすべてnull許容である必要があるため、属性を必須にすることはできません。

エンティティサブタイプの数が比較的少ない場合は、必要な属性のグループごとに依存テーブルを作成することをお勧めします。従属テーブルの主キーを親テーブルの外部キーとして定義して、1対1の関係を取得します。

CREATE TABLE Vehicles (
  vehicle_id INT PRIMARY KEY
  ...attributes common to all vehicles...
);

CREATE TABLE Automobiles (
  vehicle_id INT PRIMARY KEY,
  ...attributes specific to autos...
  FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id)
);

親テーブルの主キーでサブタイプをエンコードすることにより、もう少しデータの整合性を提供することもできます。これは、の行がAutomobilesのオートバイを参照できないようにするためVehiclesです。

CREATE TABLE Vehicles (
  vehicle_id INT,
  vehicle_type VARCHAR(10),
  ...attributes common to all vehicles...
  PRIMARY KEY (vehicle_id, vehicle_type),
  FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type)
);

CREATE TABLE Automobiles (
  vehicle_id INT,
  vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'),
  ...attributes specific to autos...
  FOREIGN KEY (vehicle_id, vehicle_type) 
    REFERENCES Vehicles(vehicle_id, vehicle_type)
);

もちろん、新しいサブタイプを定義するたびに新しい依存テーブルを作成する必要がありますが、この設計では、データの整合性やNOTNULL属性などを適用するための構造が大幅に強化されています。

アプリケーションロジックで適用する必要がある唯一の部分は、='Automobile'で各行に行を作成することを確認することですAutomobilesVehiclesvehicle_type

于 2008-11-13T19:36:04.787 に答える
2

データベースを使用してルールを適用することと、ソース コードを別の場所で使用することに違いはありません。コードはデータです。それが難解な Lisp の答えです。

あなたが尋ねている本当の質問は、これがリレーショナル データベースまたは (私が推測する) Algol ファミリ言語のどちらで簡単であるかということです。RDBMS を指定しなかったので、ANSI を想定します。それはこれを難しくします。

ところで、これは Prolog では簡単です。しかし、それはここでもそこでもありません。

すべてにチェック制約を使用することをお勧めします。このアプローチに必要な精神的転換は、これらのタグの関係を定義する方法が UI に必要になることを認識することです。従来、UI から DB に CRUD ステートメントを発行していました。代わりに、CRUD チェック制約に対して ALTER TABLE ステートメントを発行する必要があります。

このアプローチには 2 つの問題があります。

  • このようなステートメントは、ほとんどの RDBMS でパラメーター化できません。SQL インジェクションを考えてみてください。
  • 完全な ANSI チェック制約のサポートは実装によって異なります。サブクエリがサポートされていない場合は、忘れてください。

特定の RDBMS で質問を明確にすることができれば、より適切な回答を提供できます。

于 2009-01-21T06:32:05.410 に答える