与属性的多对多关系

som*_*ser 6 sqlite database-design

我正在做一个需要图书数据库的项目。问题如下:

一本书可以与多个人(作者、编辑、翻译者等)相关。那么一个人可能会以不同的角色为不同的书籍做出贡献。

Book1 PersonA (author), PersonB(editor)
Book2 PersonC (author), PersonB(translator), PersonD(editor)
Book3 PersonE (author), PersonA(editor)
Run Code Online (Sandbox Code Playgroud)

我有一张BOOKS桌子(bookID, bookTitle),一张PEOPLE桌子(personID, personName)和一张ROLES桌子(roleID, roleName)。然后我需要一种方法来关联这些表,然后查询它们。我想到了一个具有以下行结构的连接表:

bookId personID roleID
Run Code Online (Sandbox Code Playgroud)

这是处理这个问题的最佳方式吗(在所有这些表上插入、更新和删除条目时)?如果没有,有哪些替代方案?

注意:我使用的是 SQLite3。

PS:我希望我对术语的使用是正确的。

Nei*_*gan 2

    \n
  1. 我会使用派对模型,这样您就可以将一本书与个人或组织联系起来,而不仅仅是个人。例如,您可能希望兰登书屋担任出版商的角色。或者 M\xc3\xb6tley Cr\xc3\xbce 作为这本书的作者,而不仅仅是 Tommy Lee。

  2. \n
  3. 否则,看起来不错。您可能需要考虑将书籍与 PartyRole 关联,而不是单独关联 Party 和 Role,因为您可能拥有与特定角色中的 Party 相关的额外信息。也许是作者的笔名。

  4. \n
\n\n

Postgres-y SQL,但与 SQLite 足够接近:

\n\n
create table parties (\n  party_id int primary key,\n  party_type smallint not null references party_types(party_type_id), --1=individual,2=org\n  name text not null\n);\n\ncreate table party_roles (\n  party_role_id int primary key,\n  party_id int not null references parties(party_id),\n  role_id smallint not null references roles(role_id),\n  ...\n  extra information about a party pertaining to a role\n  ...\n);\n\ncreate table book_roles (\n  book_id int references books(book_id),\n  party_role_id int references party_roles(party_role_id),\n\n  primary key (book_id, party_role_id)\n);\n
Run Code Online (Sandbox Code Playgroud)\n