首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多对多关系使用两个相似的表或标志。

对多对多关系使用两个相似的表或标志。
EN

Stack Overflow用户
提问于 2016-09-10 13:32:27
回答 3查看 104关注 0票数 0

最近我遇到了一个项目,我想把一些应用程序添加到一个数据库中。每个应用程序都有1:1、1:n或n:m关系中的附加信息。虽然我知道如何存储这样的关系,但我对每个应用程序的开发人员/发布者都有一些麻烦。

的情况:

  • 几千个应用程序
  • 每个应用程序都有自己的id。
  • 几千家公司
  • 每个公司(开发人员/出版商)都有自己的id。
  • 每个应用程序都可以有0,1或多个开发人员。
  • 每个应用程序可以有0,1或多个发布者。
  • 每个开发人员可以有一个或多个应用程序。
  • 每个发行者可以有一个或多个应用程序。

很明显,这是一种多对多的关系,因此需要一个连接表。不幸的是,至少有两个可行的选择。

公司

代码语言:javascript
复制
CREATE TABLE `company` (
 `id` smallint(5) UNSIGNED NOT NULL,
 `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(我在这个表中合并了开发人员和发布者,因为开发人员也可以是发布者,反之亦然。我认为这比在两个单独的表中有冗余要好,不是吗?)

选项1:

第一个选择是创建两个单独的表。

app_developer

代码语言:javascript
复制
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

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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;

我不知道将来是否需要搜索某个特定开发者/出版商的所有应用程序,或者仅仅是一个没有进一步用途的附加信息。

哪一种选择会更好(在一致性、冗余性、性能方面),还是没有很大的差别?

EN

回答 3

Stack Overflow用户

发布于 2016-09-10 13:43:35

你的第一个选择是非常有效的。存储在两个不同的表中实际上是好的。创建两个表并使用app_id作为外键。将数据存储在两个不同的表中可以使数据变得非常清晰,而且数据检索也将非常容易和更快。如果有任何疑问让我知道,我会很清楚地解释你

票数 0
EN

Stack Overflow用户

发布于 2016-09-11 04:02:06

选项3:类似于#2,但对dev和pub使用ENUMSET

我会考虑选项1或选项3,但我不会为一个简单的多到多映射表包括一个id;它会减慢速度。

关于如何编写最优的多到多表的http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table和技巧。

票数 0
EN

Stack Overflow用户

发布于 2016-09-13 05:25:28

你的第二个选择是朝正确的方向走。但这不仅建立了公司和项目之间的关系,而且建立了关系的类型--开发商或出版商。

代码语言:javascript
复制
create table ProjCompany(
    ProjID    int not null references Projects( ID ),
    CompanyID int not null references Company( ID ),
    TypeID    char( 1 ) not null references Types( ID ), -- 'D' or 'P'
    constraint OK_ProjCompany primary key( ProjID, CompanyID, TypeID )
);

一个项目只能让每个公司作为开发人员上市一次,但同一家公司也可以作为发行者出现。公司可以是任意数量项目的开发人员和/或发行者。

如果任何表都需要对特定项目的特定开发人员进行FK引用,它将使用项目id、公司id和开发人员标志引用该表。如果该公司未被定义为该项目的开发人员,则该引用将被拒绝。

此外,我将推荐一个显示每个项目及其开发人员的视图,以及一个显示每个项目及其发布者的视图。这对于只与开发人员或发布者一起工作的部分代码来说是有用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39426581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档