数据库设计可容纳多种项目类型

时间:2017-09-19 18:10:22

标签: mysql sql database-design foreign-keys

我有一个以下问题,即设计这部分数据库的最佳方法是什么。虽然不直接从项目中获取,但下面的示例应该很好地说明我的问题。

让我们说有一个网站上有购买的独特/收藏品。这些项目按类别分组 - 每个项目都放在自己的表格中。我们以两个为例:

create table books (
  id bigint not null auto_increment primary key,
  -- common for all items
  username name(100) not null,
  description varchar(100)
  -- specific to books
  num_pages int,
  --[...]
  );

create table cds (
  id bigint not null auto_increment primary key,
  -- common for all items
  username name(100) not null,
  description varchar(100)
  -- specific to books
  num_songs int,
  --[...]
  );

在我自己的项目中,每个项目类型可能有很多自己的属性,仅针对自身,与其他属性无关。可能还有很多项目类型。

本网站允许购买物品。为简单起见,我们假设每个项目表中的每个条目都是单个项目(数量1),每个项目可能只有一个买方。

现在,关于这个问题 - 在那个网站上我希望得到所有购买物品的总清单,让我们在最后一小时说出来。该列表显示公共字段(名称,描述,买方),并允许导航到已购买的项目以在单独的页面中查看其详细信息,该页面依次显示特定于该类别的字段,如果有&#39则显示买方一个。

我最初的方法就是这样 - 我可以使用公共列+ buyer_id + buy_date创建一个表,并在每个项目类型表(书籍,cds等)中将其PK作为FK。通过这种方式,我可以轻松显示全球购买历史记录,在浏览特定项目时,我可以查看是否已购买。该表中的PK也可以被视为一种" guid"对于项目。但是,在浏览历史记录时,如果他们全部在多个单独的表中并且我拥有的只是一个guids表,那么如何回到这个案例中的特定项目?我可以将FK保存到那里的每个项目PK中,但是这种方法看起来非常奇怪且效率低下(一次只能设置一个FK)。如果有50个项目类型,那个表格会突然持有50个不同的FK,每次只有一个。我还可以持有一对item_id + item_type并根据item_type确定要查询的表,但这也可以用更好的方式解决。

我该如何处理?也许我可以对基本假设做些什么来使它更容易一些?

1 个答案:

答案 0 :(得分:0)

一种方法是使用Items表来枚举所有类型的项目。您购买交易日志将参考项目。 Books,Cds和其他类型特定的表也会引用Items。

create table Items (
  id bigint not null auto_increment primary key,
  -- common for all items
  username name(100) not null,
  description varchar(100),
  -- type
  itemType nvarchar(128) NOT NULL
  );

create table books (
  id bigint not null foreign key refers Items(id),
  -- specific to books
  num_pages int,
  --[...]
  );