数据库设计 – 为具有多个多对多关系的视频游戏业务域设计数据库
副标题[/!--empirenews.page--]
我对数据库设计比较陌生,我决定建立自己的假设数据库进行实践.但是,我在建模和规范化时遇到了麻烦,因为我认为存在许多多对多(M:N)关系. 一般情景描述 该数据库旨在保留有关使用塞尔达系列的各种人员的数据.我想跟踪可以玩游戏的控制台,参与游戏开发的员工,员工的工作(许多员工在多个游戏中从事不同的工作)等. 商业规则 >多名员工可以参与多个游戏. 属性名称和样本值 >员工姓名,可以拆分为第一个和最后一个(例如“John”和“Doe”) 问题 到目前为止,似乎无论我设计什么,数据冗余和M:N关系到处都是感兴趣的实体类型.但是我觉得数据库设计者必须一直遇到这种问题,所以必须有一个解决方案. 注意:我能够找到填充表格的数据,问题是将其组织成一个数据库,其中包含规范化形式的表格. 解决方法是的,识别多对多(简称为M:N)关联或关系是数据库从业者在布局概念模式时非常常见的情况.所述基数的关联在非常不同的商业环境中通常是重要的,并且当通过例如SQL-DDL安排在逻辑级别适当地表示时,它们不会引入有害的冗余.通过这种方式,数据库建模练习的目标应该是高精度地反映所关注的商业环境的重要特征;因此,如果你正确地识别出有许多M:N关联,那么你必须在(a)概念模式中以及(b)相应的逻辑级声明中表达它们,无论它有多少个连接 – 或任何必须解决其他类型的基数问题. 商业规则 您提供了一个语境良好的问题,并且还澄清了您正在处理的数据库纯粹是低调的,这是一个重要的观点,因为我认为像正在考虑的业务领域的“真实世界”案例将是更广泛的. 我决定(1)对你提供的业务规则进行一些修改和扩展,以便(2)产生一个更具描述性的概念模式 – 尽管还是假设的 – .以下是我放在一起的一些配方: > Party1是个人或组织 1缔约方在提及组成单一实体的个人或一组个人时,在法律背景中使用的术语,因此该面额适合代表人和组织. IDEF1X图 随后,我创建了Figure 1中显示的IDEF1X2图表(确保单击链接以更高的分辨率查看它),在单个图形设备中合并上面提供的业务规则(以及其他一些看起来相关的规则): 2信息建模的集成定义(IDEF1X)是一种非常值得推荐的数据建模技术,由美国国家标准与技术研究院(NIST)于1993年12月作为标准建立.它完全基于(a)由关系模型的发起者撰写的早期理论材料,即E. F. Codd博士; (b)Dr. P. P. Chen entity-relationship开发的数据视图;以及(c)由Robert G. Brown创建的逻辑数据库设计技术. 如您所见,我通过相应的关联实体类型仅描绘了三个M:N关联,即: >合作者, 在其他方面,有两种不同的超类型 – 子类型结构,其中: >人与组织是党的互斥实体子类型,其实体超类型;和 如果您不熟悉超类型 – 子类型关联,您可能会找到帮助,例如,我对问题的答案 >“Modeling a scenario in which each Music Artist is either a Group or a Solo Performer”, 说明性的逻辑SQL-DDL布局 接下来,我们必须确保在逻辑层面: >每个实体类型由单个基表表示; 所以我根据之前显示的IDEF1X图宣布了以下DDL安排: CREATE TABLE PartyType ( -- Stands for an independent entity type. PartyTypeCode CHAR(1) NOT NULL,-- To retain 'P' or 'O'. Name CHAR(30) NOT NULL,-- To keep 'Person' or 'Organization'. -- CONSTRAINT PartyType_PK PRIMARY KEY (PartyTypeCode) ); CREATE TABLE Party ( -- Represents an entity supertype. PartyId INT NOT NULL,PartyTypeCode CHAR(1) NOT NULL,-- To hold the value that indicates the type of the row denoting the complementary subtype occurrence: either 'P' for 'Person' or 'O' for 'Organization'. CreatedDateTime TIMESTAMP NOT NULL,-- CONSTRAINT Party_PK PRIMARY KEY (PartyId),CONSTRAINT PartyToPartyType_FK FOREIGN KEY (PartyTypeCode) REFERENCES PartyType (PartyTypeCode) ); CREATE TABLE Person ( -- Denotes an entity subtype. PersonId INT NOT NULL,-- To be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY. FirstName CHAR(30) NOT NULL,LastName CHAR(30) NOT NULL,GenderCode CHAR(3) NOT NULL,BirthDate DATE NOT NULL,-- CONSTRAINT Person_PK PRIMARY KEY (PersonId),CONSTRAINT Person_AK UNIQUE (FirstName,LastName,GenderCode,BirthDate),-- Composite ALTERNATE KEY. CONSTRAINT PersonToParty_FK FOREIGN KEY (PersonId) REFERENCES Party (PartyId) ); CREATE TABLE Organization ( -- Stands for an entity subtype. OrganizationId INT NOT NULL,-- To be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY. Name CHAR(30) NOT NULL,FoundingDate DATE NOT NULL,-- CONSTRAINT Organization_PK PRIMARY KEY (OrganizationId),CONSTRAINT Organization_AK UNIQUE (Name),-- Single-column ALTERNATE KEY. CONSTRAINT OrganizationToParty_FK FOREIGN KEY (OrganizationId) REFERENCES Party (PartyId) ); CREATE TABLE ProductType ( -- Represents an independent entity type. ProductTypeCode CHAR(1) NOT NULL,-- To enclose the values 'S' and 'G' in the corresponding rows. Name CHAR(30) NOT NULL,-- To comprise the values 'System' and 'Person' in the respective rows. -- CONSTRAINT ProductType_PK PRIMARY KEY (ProductTypeCode) ); CREATE TABLE Product ( -- Denotes an entity supertype. OrganizationId INT NOT NULL,ProductNumber INT NOT NULL,ProductTypeCode CHAR(1) NOT NULL,-- To keep the value that indicates the type of the row denoting the complementary subtype occurrence: either 'S' for 'System' or 'G' for 'Game'. CreatedDateTime DATETIME NOT NULL,-- CONSTRAINT Product_PK PRIMARY KEY (OrganizationId,ProductNumber),-- Composite PRIMARY KEY. CONSTRAINT ProductToOrganization_FK FOREIGN KEY (OrganizationId) REFERENCES Organization (OrganizationId),CONSTRAINT ProductToProductType_FK FOREIGN KEY (ProductTypeCode) REFERENCES ProductType (ProductTypeCode) ); CREATE TABLE SystemType ( -- Stands for an independent entity type. SystemTypeCode CHAR(1) NOT NULL,Name CHAR(30) NOT NULL,-- CONSTRAINT SystemType_PK PRIMARY KEY (SystemTypeCode) ); CREATE TABLE MySystem ( -- Represents a dependent entity type. OrganizationId INT NOT NULL,-- To be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY. SystemNumber INT NOT NULL,SystemTypeCode CHAR(1) NOT NULL,ParticularColumn CHAR(30) NOT NULL,-- CONSTRAINT System_PK PRIMARY KEY (OrganizationId,SystemNumber),CONSTRAINT SystemToProduct_FK FOREIGN KEY (OrganizationId,SystemNumber) REFERENCES Product (OrganizationId,CONSTRAINT SystemToSystemType_FK FOREIGN KEY (SystemTypeCode) REFERENCES SystemType (SystemTypeCode) ); CREATE TABLE Game ( -- Denotes an entity subtype. OrganizationId INT NOT NULL,-- To be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY. GameNumber INT NOT NULL,SpecificColumn CHAR(30) NOT NULL,-- CONSTRAINT Game_PK PRIMARY KEY (OrganizationId,GameNumber),CONSTRAINT GameToProduct_FK FOREIGN KEY (OrganizationId,GameNumber) REFERENCES Product (OrganizationId,ProductNumber) ); CREATE TABLE Genre ( -- Stands for an independent entity type. GenreNumber INT NOT NULL,Name CHAR(30) NOT NULL,Description CHAR(90) NOT NULL,-- CONSTRAINT Genre_PK PRIMARY KEY (GenreNumber),CONSTRAINT Genre_AK1 UNIQUE (Name),CONSTRAINT Genre_AK2 UNIQUE (Description) ); CREATE TABLE SystemGame ( -- Represents an associative entity type or M:N association. SystemOrganizationId INT NOT NULL,SystemNumber INT NOT NULL,GameOrganizationId INT NOT NULL,GameNumber INT NOT NULL,CreatedDateTime DATETIME NOT NULL,-- CONSTRAINT SystemGame_PK PRIMARY KEY (SystemOrganizationId,SystemNumber,GameOrganizationId,-- Composite PRIMARY KEY. CONSTRAINT SystemGameToSystem_FK FOREIGN KEY (SystemOrganizationId,SystemNumber) -- Multi-column FOREIGN KEY. REFERENCES MySystem (OrganizationId,CONSTRAINT SystemGameToGame_FK FOREIGN KEY (SystemOrganizationId,GameNumber) -- Multi-column FOREIGN KEY. REFERENCES Game (OrganizationId,GameNumber) ); CREATE TABLE GameGenre ( -- Denotes an associative entity type or M:N association. GameOrganizationId INT NOT NULL,GameNumber INT NOT NULL,GenreNumber INT NOT NULL,CreatedDateTime DATETIME NOT NULL,-- CONSTRAINT GameGenre_PK PRIMARY KEY (GameOrganizationId,GameNumber,GenreNumber),-- Composite PRIMARY KEY. CONSTRAINT GameGenreToGame_FK FOREIGN KEY (GameOrganizationId,GameNumber) REFERENCES Game (OrganizationId,-- Multi-column FOREIGN KEY. CONSTRAINT GameGenreToGenre_FK FOREIGN KEY (GenreNumber) REFERENCES Genre (GenreNumber) ); CREATE TABLE Job ( -- Stands for an associative entity type or M:N association. OrganizationId INT NOT NULL,JobNumber INT NOT NULL,Title CHAR(30) NOT NULL,CreatedDateTime DATETIME NOT NULL,-- CONSTRAINT Job_PK PRIMARY KEY (OrganizationId,ProductNumber,JobNumber),-- Composite PRIMARY KEY. CONSTRAINT Job_AK UNIQUE (Title),-- Single-column ALTERNATE KEY. CONSTRAINT JobToProduct_FK FOREIGN KEY (OrganizationId,ProductNumber) -- Multi-column FOREIGN KEY. REFERENCES Product (OrganizationId,ProductNumber) ); CREATE TABLE Collaborator ( -- Represents an associative entity type or M:N association. CollaboratorId INT NOT NULL,OrganizationId INT NOT NULL,ProductNumber INT NOT NULL,JobNumber INT NOT NULL,AssignedDateTime DATETIME NOT NULL,-- CONSTRAINT Collaborator_PK PRIMARY KEY (CollaboratorId,OrganizationId,-- Composite PRIMARY KEY. CONSTRAINT CollaboratorToPerson_FK FOREIGN KEY (CollaboratorId) REFERENCES Person (PersonId),CONSTRAINT CollaboratorToJob_FK FOREIGN KEY (OrganizationId,JobNumber) -- Multi-column FOREIGN KEY. REFERENCES Job (OrganizationId,JobNumber) ); (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |