2

book_personテーブル間にブリッジテーブルがbookありperson、多対多の関係を提供します。このテーブルには、特定の本で人が持つ役割 (著者、編集者、イラストレーター、翻訳者など) を設定する役割定義もあります。book_authorここで、役割を分割して役割テーブルを分離することを検討します(book_translatorなど)。しかし、私は疑わしいです、それは良い考えですか?専門家にとっては、DB がよりクリーンになり、DBIC スキーマ ローダーがそのような単純なブリッジ テーブルを検出し、多対多のアクセサーを作成するという単純な利点が 1 つあります。短所として、ロールの集約関数にはさらに結合が必要になることがわかります。

オールインワンの role-bridgetable よりも個別の role-bridgetable を使用する利点は何ですか? そして、欠点は何ですか?ORM (DBIx::Class) を使用してアプリをアップグレードしようとしていますが、まだよくわからないため、それに対する考慮も大歓迎です。

4

2 に答える 2

2

人が本に対して複数の役割を持つことができることを考えると、外部キーとして person-id/book-id と役割 ID を持つ別のテーブル (book_person_role など) を作成します。したがって、book_person から book_person_role への 1 対多の関係が得られます。ロールごとにテーブルを作成しません。これは、ロールが追加/削除/変更されたときにスキーマを変更することを意味します。

于 2013-09-26T11:48:14.133 に答える
2
create table book (
  id_book integer primary key,
  name_book text,
  author_book
);

create table person (
  id_person integer primary key,
  name_person text
);

create table book_person (
  id_person integer,
  id_book integer,
  role_person text,
  primary key (id_person, id_book)
);

次の理由から、1 人が 1 つのロールしか持たない場合は、 book_person テーブルでロールを使用するのが良い選択だと思います。

  1. 使用するロールはごくわずかです。
  2. book_author、book_translator などのテーブルをさらに作成すれば、DB を散らかすことができます。
  3. 多くの結合を言ったように使用する必要はありません。
  4. あなたの場合の役割は単なる属性であり、役割の機能に関する追加情報を保持していない場合は、役割と個人をバインドし続けるためにもう1つのテーブルを作成しないでください。あなたはすでにbook_personに保管しています。

次の場合は、ロール用に別のテーブルを作成する必要があります。

  1. 1 人に複数の役割があります。
  2. 上で述べたように、ロールに関する追加情報を保持します。

それだけだと思います。

于 2013-09-26T12:08:28.537 に答える