2

タイプAの1つのインスタンスをタイプBのインスタンスのセットにリンクする方法がわからないため、postgreSQLで苦労しています。簡単な例を示します。

たとえば、音楽アルバムと人々を含むDBを設定し、それぞれにお気に入りのアルバムのリストを設定するとします。次のようなタイプを定義できます。

CREATE TYPE album_t AS (
Artist VARCHAR(50),
Title VARCHAR(50)
);

CREATE TYPE person_t AS (
FirstName VARCHAR(50),
LastName VARCHAR(50),
FavAlbums album_t ARRAY[5]
);

次に、これらのタイプのテーブルを作成します。

CREATE TABLE Person of person_t WITH OIDS;
CREATE TABLE Album of album_t WITH OIDS;

DBをオブジェクトとして現実的なものにしたいので、PersonテーブルのFavAlbums行にアルバム「objects」をネストしたくありませんが、Albumテーブルのエントリを「ポイント」したいと思います。 、n人のレコードが同じアルバムレコードを何度も複製することなく参照できるようにします。

マニュアルを読みましたが、オブジェクトリレーショナル機能があまり使用されていないため、いくつかの重要な例が不足しているようです。私は現実化モデルにも精通していますが、リレーションに追加のテーブルを使用したいと思います。

4

3 に答える 3

5

なぜあなたはあなたが必要なことをするためにpostgresqlで新しいタイプを作成するのですか?なぜテーブルを直接使用しないのですか?

nn関係の場合:

CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50)
);
CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
);
CREATE TABLE person_album (
  person_id integer,
  album_id integer,
  primary key (person_id, album_id),
  FOREIGN KEY (person_id)
    REFERENCES person (idperson),
  FOREIGN KEY (album_id)
    REFERENCES album (idalbum));

または、「純粋な」1-n関係の場合:

CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
); 
CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50),
  person_id integer,
  FOREIGN KEY (person_id)
    REFERENCES person (idperson)
);

お役に立てば幸いです。

于 2011-07-15T10:34:47.480 に答える
3

DBをオブジェクトとして現実的なものにしたいので、PersonテーブルのFavAlbums行にアルバム「objects」をネストしたくありませんが、Albumテーブルのエントリを「ポイント」したいと思います。 、n人のレコードが同じアルバムレコードを何度も複製することなく参照できるようにします。

配列列を削除し、各テーブルにid主キー列(シリアルタイプ)を追加し、OIDを削除します(マニュアルではそれらの使用を推奨していないことに注意してください)。そして、2つの列(PersonId、AlbumId)を持つFavoriteAlbumテーブルを追加します。後者は主キーです。(あなたの関係は、1-nではなくnnです。)

于 2011-07-15T03:47:04.513 に答える
0

自分の質問に答えて申し訳ありませんが、その例をいじって得た情報をいくつか提供したいと思います。

配列タイプ

PostgreSQLのARRAY型は、可変数の値を1つの属性に関連付けたい場合に便利ですが、重複するエントリを処理できる場合に限ります。そのため、この手法は、アイデンティティによって「オブジェクト」を参照するのには適していません。

IDによるオブジェクト/レコードへの参照

したがって、私の例のように、アルバムのテーブルを作成し、複数の人が1つのアルバムを参照できるようにする場合は、別のテーブルを使用してこれらの関係を確立する必要があります(OIDをキーとして使用する場合もあります)。 。

もう1つのクレイジーなことは、人物テーブルのOIDの配列を使用してアルバムを参照することです。しかし、それは非常に厄介であり、古典的なリレーショナルスタイルを実際に改善することはありません。

于 2011-07-15T12:36:58.607 に答える