最近我遇到了一个项目,我想把一些应用程序添加到一个数据库中。每个应用程序都有1:1、1:n或n:m关系中的附加信息。虽然我知道如何存储这样的关系,但我对每个应用程序的开发人员/发布者都有一些麻烦。
的情况:
很明显,这是一种多对多的关系,因此需要一个连接表。不幸的是,至少有两个可行的选择。
公司
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;我不知道将来是否需要搜索某个特定开发者/出版商的所有应用程序,或者仅仅是一个没有进一步用途的附加信息。
哪一种选择会更好(在一致性、冗余性、性能方面),还是没有很大的差别?
发布于 2016-09-10 13:43:35
你的第一个选择是非常有效的。存储在两个不同的表中实际上是好的。创建两个表并使用app_id作为外键。将数据存储在两个不同的表中可以使数据变得非常清晰,而且数据检索也将非常容易和更快。如果有任何疑问让我知道,我会很清楚地解释你
发布于 2016-09-11 04:02:06
选项3:类似于#2,但对dev和pub使用ENUM或SET。
我会考虑选项1或选项3,但我不会为一个简单的多到多映射表包括一个id;它会减慢速度。
关于如何编写最优的多到多表的http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table和技巧。
发布于 2016-09-13 05:25:28
你的第二个选择是朝正确的方向走。但这不仅建立了公司和项目之间的关系,而且建立了关系的类型--开发商或出版商。
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和开发人员标志引用该表。如果该公司未被定义为该项目的开发人员,则该引用将被拒绝。
此外,我将推荐一个显示每个项目及其开发人员的视图,以及一个显示每个项目及其发布者的视图。这对于只与开发人员或发布者一起工作的部分代码来说是有用的。
https://stackoverflow.com/questions/39426581
复制相似问题