【发布时间】: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 确定要查询的表,但这也感觉可以以更好的方式解决。
我该如何处理?也许我可以对基本假设做一些事情,让它变得更容易一些?
【问题讨论】:
-
这是一个常见问题解答,谷歌我的(无休止} SO cmets 重新分类型。您当前的标题谷歌搜索答案。
标签: mysql sql database-design foreign-keys