【问题标题】:Database design to hold multiple item types数据库设计以保存多种项目类型
【发布时间】:2018-02-28 15:16:56
【问题描述】:

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

假设有一个网站可以购买独特/收藏品。这些项目被分组 - 每个我都放在自己的表中。我们以两个为例:

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),并且每个可能只有一个买家。

现在,关于问题 - 在那个网站上,我想获得所有购买物品的总清单,假设是在最后一个小时内。该列表显示常见字段(名称、描述、买家),并允许导航到已购买的项目以在单独的页面中查看其详细信息,该页面又显示特定于类别的字段,如果有的话,加上买家。

我最初的方法是这样的 - 我可以创建一个包含公共列 + buy_id + buy_date 的表,并在每个项目类型表(书籍、CD 等)中将其 PK 作为 FK。这样我就可以轻松地显示全球购买历史记录,并在浏览特定项目时查看它是否被购买。该表中的 PK 也可以被视为项目的“指南”。但是,在浏览历史记录时,在这种情况下,当它们都位于多个单独的表中并且我只有这一表的指导时,我该如何返回到特定项目?我可以在那里对这些项目 PK 中的每一个进行 FK,但这种方法似乎非常奇怪且效率低下(一次只需要设置一个 FK)。如果有 50 种项目类型,那么该表会突然容纳 50 个不同的 FK,每次只有一组。我还可以持有一对 item_id+item_type 并根据 item_type 确定要查询的表,但这也感觉可以以更好的方式解决。

我该如何处理?也许我可以对基本假设做一些事情,让它变得更容易一些?

【问题讨论】:

标签: mysql sql database-design foreign-keys


【解决方案1】:

一种方法是创建一个枚举所有类型项目的 Items 表。您购买交易日志将参考项目。书籍、CD 和其他类型特定的表格也将引用项目。

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,
  --[...]
  );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2010-11-18
    • 2013-05-02
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多