PostgreSQLの制約

だから、私は解決しようとしているこの練習を持っています。データベースがあり、制約を追加する必要があります。私はこれを初めて学んだので、私はそれを正しく解決するかどうか分かりませんが、私は自分自身を教えようとしていますが、検索した後、私は外来のキー制約を使用するかもしれないと結論づけました。

これらは私のdbのこの質問の関連テーブルです:

MusicGroup(idG, name, city, country, year)

Edition(idG, titleE, year, editor)
idG : FK(MusicGroup)

Music(idG, titleM, length)
idG : FK(MusicGroup)

Album(idG, titleE)
idG, titleE : FK(Edition)

Track(idG, titleE, number, titleM)
idG, titleE : FK(Album)
idG, titleM : FK(Music)

Single(idG, titleE, titleM)
idG, titleE : FK(Edition)
idG, titleM : FK(Music)

データベースを作成する手順は次のとおりです(これも私が作ったものです):

create table MusicGroup (idG char(10) not null
    unique(idG),
    name varchar(255) not null,
    city varchar(255) not null,
    country varchar(255) not null,
    year numeric(6,0) not null,
    primary key (idG))


create table Edition (idG char(10) not null,
    titleE varchar(50) not null,
    year numeric(6,0) not null,
    editor varchar(255) not null,
    primary key (idG, titleE),
    foreign key(idG) references MusicGroup(idG))


create table Music (idG char(10) not null,
    titleM varchar(50) not null
    unique(titleM),
    length float(1) not null,
    primary key (idG, titleM),
    foreign key(idG) references MusicGroup(idG))


create table Album (idG char(10) not null,
    titleE varchar(50) not null,
    primary key (idG, titleE),
    foreign key(idG, titleE) references Edition(idG, titleE))


create table Track (idG char(10) not null,
    titleE varchar(50) not null,
    number smallint not null,
    titleM varchar(50) not null,
    primary key (idG, titleE, number),
    foreign key(idG, titleE) references Album(idG, titleE),
    foreign key(idG, titleM) references Music(idG, titleM))


create table Single (idG char(10) not null,
    titleE varchar(50) not null,
    titleM varchar(50) not null,
    primary key (idG, titleE),
    foreign key(idG, titleE) references Edition(idG, titleE),
    foreign key(idG, titleM) references Music(idG, titleM))

アルバムのタイトルはそのアルバムのトラックのタイトルでなければならず、そのトラックは既にシングルとして公開されていなければなりません。

だから私はこのように解決しようとしました:

alter table Album
add foreign key (idG, titleE, titleE) references Track(idG, titleE, titleM)

alter table Track
add foreign key (idG, titleE, titleM) references Single(idG, titleE, titleM)

私は最初の外来キーがあまりにも良くないと言わなければならないが、私が言ったように、私はこれに新しいです。

助けを借りてありがとうございました。

ベストアンサー

最初:

  • すべてのテーブルに単一フィールド(非コンポジット)主キーがあるようにします。
    (これは別の制約の必要性を引き起こします:アルバムやエディションに複数のアーティストからの断片を入れることはできません)また、これらの代理IDを数値にすることも強く感じています。
  • 多くのエンティティに固有の名前を付けます。これはおそらく保持されません(「最大ヒット数」)
  • いくつかの命名:ほとんどの人がTableNamesのMixedCaseに対して強くアドバイスします(毎回識別子を引用する必要があり、読みにくいですが、相によっては大文字と小文字が区別されるDBMSも混乱するかもしれません)月の)
  • より多くの命名:私はあなたが音楽と呼ぶものを追跡します。
  • 私はMusicGroupsと呼ぶアーティストに電話をかけます
  • トラックの名前を「トラックリスト」や「album_toc」(またはtrack_album_relation)に変更します。
  • (多分)シングルとアルバムを1つのエンティティ(「zrecord」)に結合し、タイプタグを追加すると、これはシングルがフリップサイドを持ち、EPが許可されます。
  • Editionの目的がわからない個々のトラックにも同様のメカニズム(「バージョン」、「リマスタリング」)が必要な場合もあります。

…続きを読む

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です