【发布时间】:2016-09-13 13:25:28
【问题描述】:
我最近遇到了一个项目,我想将一些应用程序添加到数据库中。每个应用程序都有以 1:1、1:n 或 n:m 关系出现的附加信息。虽然我知道如何存储此类关系,但我在每个应用程序的开发者/发布者方面遇到了一些麻烦。
情况:
- 数千个应用程序
- 每个应用都有自己的 id
- 数千家公司
- 每个公司(开发者/发布者)都有自己的 ID
- 每个应用可以有 0、1 或多个开发者
- 每个应用可以有 0、1 或多个发布者
- 每个开发者可以拥有 1 个或多个应用程序
- 每个发布者可以有 1 个或多个应用程序
很明显,这是一个多对多关系,因此需要一个联结表。不幸的是,至少有两个可行的选择。
公司
CREATE TABLE `company` (
`id` smallint(5) UNSIGNED NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(我在这张表中合并了开发者和发布者,因为开发者也可以是发布者,反之亦然。我认为这比在两个单独的表中冗余更好,不是吗?)
选项 1:
第一个选项是创建两个单独的表。
app_developer
CREATE TABLE `app_developer` (
`id` mediumint(8) UNSIGNED NOT NULL,
`app_id` mediumint(8) UNSIGNED NOT NULL,
`company_id` mediumint(8) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
app_publisher
CREATE TABLE `app_publisher` (
`id` mediumint(8) UNSIGNED NOT NULL,
`app_id` mediumint(8) UNSIGNED NOT NULL,
`company_id` mediumint(8) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
选项 2:
第二个选项是创建一个表并为每个应用程序/公司组合添加标志 (0/1)。
CREATE TABLE `app_company_rel` (
`id` mediumint(8) UNSIGNED NOT NULL,
`app_id` mediumint(8) UNSIGNED NOT NULL,
`company_id` mediumint(8) UNSIGNED NOT NULL,
`developer` tinyint(1) UNSIGNED NOT NULL,
`publisher` tinyint(1) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我不知道将来是否需要搜索来自特定开发者/发布者的所有应用程序,或者这只是没有进一步目的的附加信息。
哪个选项会更好(在一致性、冗余、性能方面)或者没有显着差异?
【问题讨论】:
标签: mysql database-design many-to-many