mysql数据库结构设计_mysql – 数据库结构/设计

没有一般规则或最佳实践外键不应该是可空的.很多时候,对于不与另一个实体建立关系的实体来说,它是完全合理的.例如,您可能有一个您跟踪的艺术家表,但目前您没有这些艺术家录制的CD.

至于可以是音乐/音频或软件的媒体(CD,DVD,BluRay),您可以拥有一个共享信息的表,然后是两个外键,每个扩展表一个(AudioData和SoftwareData),但是一个必须为NULL.这呈现出一种称为独占弧的情况.这通常被认为是……有问题的.

考虑一个超类和两个派生类,如OO语言,如Java或C.在关系模式中表示的一种方法是:

create table Media(

ID int not null, -- identity, auto_generated, generated always as identity...

Type char( 1 ) not null,

Format char( 1 ) not null,

... ,

constraint PK_Media primary key( ID ),

constraint FK_Media_Type foreign key( Type )

references MediaTypes( ID ), -- A-A/V, S-Software, G-Game

constraint FK_Media_Format foreign key( Format )

references MediaFormats( ID ) -- C-CD, D-DVD, B-BluRay, etc.

);

create unique index UQ_Media_ID_Type( ID, Type ) on Media;

create table AVData( -- For music and video

ID int not null,

Type char( 1 ) not null,

... ,

constraint PK_AVData primary key( ID ),

constraint CK_AVData_Type check( Type = 'A',

constraint FK_AVData_Media foreign key( ID, Type )

references Media( ID, Type )

);

create table SWData( -- For software, data

ID int not null,

Type char( 1 ) not null,

... ,

constraint PK_SWData primary key( ID ),

constraint CK_SWData_Type check( Type = 'S',

constraint FK_SWData_Media foreign key( ID, Type )

references Media( ID, Type )

);

create table GameData( -- For games

ID int not null,

Type char( 1 ) not null,

... ,

constraint PK_GameData primary key( ID ),

constraint CK_GameData_Type check( Type = 'G',

constraint FK_GameData_Media foreign key( ID, Type )

references Media( ID, Type )

);

现在,如果您正在寻找电影,您可以搜索AVData表,然后使用Media表连接其他信息,依此类推,使用软件或游戏.如果您有ID值但不知道它是什么类型,请搜索Media表,Type值将告诉您要连接的三个(或更多)数据表中的哪一个.关键是FK指的是通用表,而不是指它.

当然,可以在多种媒体类型上发布电影或游戏或软件,因此您可以在媒体表和相应的数据表之间使用交集表. Otoh,这些通常标有不同的SKU,因此您可能还希望将它们视为不同的项目.

正如您所料,代码可能会变得相当复杂,但并不算太糟糕. Otoh,我们的设计目标不是代码简单,而是数据完整性.这使得例如将游戏数据与电影项目混合是不可能的.并且你摆脱了一组字段,其中只有一个必须有一个值,其他字段必须为null.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值