0

私の説明がタイトルよりも明確であることを願いましょう。ファイルのセットがあります。各ファイルには、さまざまな数の用紙/フォームが含まれています。だから私はファイルと呼ばれるテーブルを持っています。

簡単にするために、3 つの異なるフォームのみがあり、それぞれに独自のデータ セットが含まれているとします。したがって、FormA、FormB、および FormC の 3 つのテーブルがあり、それぞれの主キーは Aid、Bid、および Cid です。

ファイルには、たとえば、2 つの A フォームと 1 つの B フォーム、または各フォームの 1 つ、または 3 つの A フォーム、2 つの B フォーム、2 つの C フォームを含めることができます。アイデア、さまざまな数のフォームが得られ、同じタイプの複数のフォームが含まれる場合があります。

そのような関係をSQLで適切に表現するにはどうすればよいですか? 問題があれば、私は PostGreSQL を使用しています。

4

1 に答える 1

1

PostgreSQLでこれを行う方法は次のとおりです。私は危険な (非初心者/高度な) ツールを使用していることに注意してください。落とし穴を理解する価値があります。

ここには多数のテーブルがあるため、問題は制約をどのように管理するかです。これは少し複雑ですが、ここで私がやることは次のとおりです。

CREATE TABLE file (...);
-- add your tables for tracking form data here....
CREATE TABLE file_to_form (
    file_id int NOT NULL;
    refkey int NOT NULL,
    form_class char NOT NULL
    CHECK NOINHERIT (file_id IS NULL)
 );  -- this table will never have anything in it.

 CREATE TABLE file_to_form_a (
    PRIMARY KEY (file_id, refkey, form_class)
    FOREIGN KEY (refkey) REFERENCES file_a (form_id)
    CHECK (form_class = 'a')
 ) INHERITS (file_to_form);

 CREATE TABLE file_to_form_b (
    PRIMARY KEY (file_id, refkey, form_class)
    FOREIGN KEY (refkey) REFERENCES file_b (form_id)
    CHECK (form_class = 'b')
 ) INHERITS (file_to_form);

 -- etc

これで、どのフォームがファイルに関連付けられているかを表示するための一貫したインターフェイスが得られ、file_to_form テーブルを検索してそれらを見つけることができます (これは、それを継承するすべてのテーブルの読み取り専用ビューと同様に機能します)。これは、落とし穴を真剣に受け止め、それらの処理方法を考えれば、PostgreSQL のテーブル継承が本当に役立つケースの 1 つです。

于 2013-11-06T11:47:01.930 に答える