2

タイプAの1つのインスタンスをタイプBのインスタンスのセットにリンクする方法がわからないので、postgreSQLに苦労しています。簡単な例:postgreSQL(オブジェクトリレーショナル)で1:Nの関係を実装する

それぞれがお気に入りのアルバムのリストを持つ音楽アルバムとユーザーを含むDBを設定したいとしましょう。私たちは、そのようなタイプを定義することができます。今、私は、オブジェクトrealationalそれはなるにつれて、私ドンとして私のDBを作りたいと

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

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] 
); 

は、今、私たちはこれらのタイプのテーブルを作成したいですテーブルPersonの行FavAlbumsにアルバム「オブジェクト」をネストしたいが、テーブルアルバムのエントリを「ポイント」したいので、n人物レコードは同じアルバムレコードを複製せずに参照できる何度も。

私はマニュアルを読んでいますが、オブジェクトリレーショナル機能がそれほど頻繁に使用されていないため、いくつかの重要な例が欠けているようです。私はまた、現実的なモデルに精通していますが、私は関係のために余分なテーブルを使いたいと思います。

ありがとうございます! das_weezul今、私はそれを取得として、私はテーブルPersonの行FavAlbumsで巣アルバム「オブジェクト」にはしたくないオブジェクトrealationalとして私のDBを作りたいが、私がしたいよう

+2

オブジェクトリレーショナルではないリレーショナルについて読む必要があります。 –

+0

ありがとうございますが、私はpostgreSQLでサポートされているオブジェクトリレーショナルを行いたい –

+1

オブジェクトリレーショナルはオブジェクト指向ではありません。私が知っているのは、postgresqlのオブジェクトの向きに似ているのは、テーブルの継承だけです。 –

答えて

3

「のポイント"をアルバムのエントリに追加することで、n人のレコードが重複することなく同じアルバムレコードを参照できるようにします。

各テーブルにidプライマリキー列(シリアルタイプ)を追加し、oidsを削除します(マニュアルでは推奨していません)。また、2つの列(PersonId、AlbumId)を持つFavoriteAlbumテーブルを追加します。後者は主キーです。あなたの関係は1-nではなくn-nです。

+0

はい、そのm-n、あなたは絶対に正しいです –

4

なぜあなたは必要な作業をするために新しいタイプを作成しますか? なぜテーブルを直接使用しないのですか?私は、私はあなたを助けることを願っています

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) 
); 

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の関係を持つ:N-N関係で

+0

ありがとうございます。あなたの最初の答えはリレーショナルな方法であり、それはもちろん機能します。 2番目の例では、1つのアルバムを複数の人物に関連付けることはできませんでした。 –

+0

こんにちは@das_weezul、あなたのコメントは正しいです。この理由から、n-nリレーションと1-nリレーションを分けました。あなたはPostgresで1-nの関係を求めました。この場合、複数の人と1つのアルバムを関連付けることはできませんでした。このため、@Denisはあなたに必要な関係はn-nだと言いました。 – doctore

+0

また、「CREATE TABLEは、テーブルの1つの行に対応する複合型を表すデータ型を自動的に作成する」という点にも注意してください。 - [CREATE TABLE](http://www.postgresql.org/docs/9.1/static/sql-createtable.html)。 –

0

申し訳ありませんが、私は自分の質問に答えていますが、私はその例を取り上げて得た情報をいくつか与えたいと思っていました。

私はいますが、重複したエントリと一緒に暮らすことができる場合にのみ、あなたは一つの属性と値の可変数を関連付ける場合はPostgreSQLの配列型が有用であることが判明

ARRAYタイプ。この技術は、そのアイデンティティによって「オブジェクト」を参照するのには適していません。だから、アイデンティティ

によって

オブジェクト/レコードへの参照は、あなたが、私の例のように、アルバムのテーブルを作成したいと、複数の人が一枚のアルバムを参照できるようにしたい場合は、あなたがすべきですこれらの関係を確立するために別のテーブルを使用します(多分OIDをキーとして使用する)。

人のテーブルのOIDのARRAYを使ってアルバムを参照することもできます。しかし、それは非常に厄介で、古典的なリレーショナルスタイルでは本当に改善されません。

+1

PostgreSQLで配列やOIDを使用することはお勧めできません。特に、データベースエンジンがよく分からない場合は特に注意してください。 – doctore

関連する問題