2

我在表book_person之间有一个桥接表bookperson提供多对多关系。在此表中,我还有角色定义,用于设置一个人在特定书籍中的角色(作者、编辑、插图画家、翻译等)。现在我考虑将角色拆分为单独的角色表(例如book_authorbook_translator)。但我很怀疑,这是个好主意吗?对于专业人士来说,它使 DB 更加干净和一个简单的好处,我看到 DBIC 模式加载器检测到这样简单的桥表并为我创建多对多访问器。对于缺点,我看到角色的聚合函数需要更多的连接。

使用单独的角色桥接表而不是多合一角色桥接表有什么好处?以及缺点是什么?我正在尝试使用 ORM (DBIx::Class) 升级我的应用程序,但还不太了解,因此也非常欢迎对它进行考虑。

4

2 回答 2

2

鉴于一个人可以对一本书具有多个角色,我将创建一个单独的表(例如 book_person_role),其中 person-id/book-id 作为外键和一个角色 ID。因此,您获得了从 book_person 到 book_person_role 的一对多关系。我不会为每个角色创建一个表;这意味着在添加/删除/更改角色时更改架构。

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

如果一个人只有一个角色,我认为在 book_person 表中使用角色是一个不错的选择,因为:

  1. 您只使用了几个角色。
  2. 如果创建了更多的表,如 book_author、book_translator,就不会乱扔你的数据库。
  3. 您不需要像您所说的那样使用许多连接。
  4. 在您的情况下,角色只是一个属性,如果您不保留有关角色功能的一些额外信息,则不应再创建一个表来保持绑定角色-人员。您已经将它保存在 book_person 中。

如果您有以下情况,则需要为角色创建另一个表:

  1. 一个人有多个角色。
  2. 正如我上面所说,你保留了一些关于角色的额外信息。

我想就是这样。

于 2013-09-26T12:08:28.537 回答