说我们有这样的情况:

Artist ==< Album ==< Track
//ie, One Artist can have many albums, and one album can have many tracks

在这种情况下,所有3个实体有基本上相同的领域:

  • ID
  • 名称
  • 一个外国的一个多关系到相应的儿童(艺术家册和相册,以跟踪

一个典型的解决方案所提供的解决办法是三个表,与同一领域(ArtistID,专辑...等等)和外国的主要制约在一个多关系领域。

但是,我们可以在这种情况下,纳入一种形式的遗产,以避免重复相同的领域?我说的东西的排序:

Table: EntityType(EntityTypeID, EntityName)
       This table would hold 3 entities (1. Artist, 2. Album, 3. Track)

Table: Entities(EntityID, Name, RelField, EntityTypeID)
       This table will hold the name of the entity (like the name of 
       an artist for example), the one-many field (foreign-key
       of EntityID) and EntityTypeID holding 1 for Artist, 2 for Album 
       and so on. 

什么你认为关于上述设计?它是有意义的纳入"面向对象的概念"在此数据库的情况?

最后,你会喜欢的具有外国主要制约因素的第一个方案,或更通用的(与风险联系起来一个艺术家一道例如,由于没有查看inputter外键值是真正的专辑)的做法?

..顺便说一句,我想起来了,我认为你可以实际检查,如果输入的价值的RelField一个艺术家对应于一册,触发可能?

有帮助吗?

解决方案

我们最近看到的这个非常的想法的抽象实现统和应用程序及其数据库成为一个怪物来维持和疑难解答。我将远离这种技术。更简单、更好,我的口头禅。

其他提示

有很少的机会,其他领域将不可避免地积累的各种实体将作为乐于助人。没有什么可获得了通过不反映现实,在一个合理的关闭时尚。

我不想你甚至很有可能将这些实体在经常OO的设计。

这让我想起(但只是略微)的一种尝试,我看到一旦实现一切都在一个单一的表格(名为"实体")的另一个表(定名为"属性")和一个连接表他们之间。

通过卡所有三个在一起,你让你的查询小readble(除非你然后分解的三个类别的意见)和你做的搜索和索引更多的困难。

另外,在某些时候,你会想要添加的属性的一个类别,这是不属性的其他人。坚持所有三个在一起给你没有时间改变不挖出的大块的系统。

别这么聪明你的旅行自己了。

唯一的优点我可以看到这样做在你的面向对象的方式是如果还有其他元素的类型,在未来增加(即,比其他的艺术家、唱片和轨道)。在这种情况下,你不需要一个架构的变化。

然而,我会倾向于选择非面向对象的方式和仅仅改变模式,在这种情况。一些问题,你已经用面向对象的方案是:

  • 什么如果你想添加的出生日期的艺术家吗?
  • 什么如果你想商店的持续时间相册,并跟踪?
  • 什么如果要存储轨道类型?

基本上,如果你想要保存的东西的psecific只要一个或两个元素的类型?

如果你是在这样的事情,然后看看表的继承 PostgreSQL.

create table Artist (id integer not null primary key, name varchar(50));
create table Album (parent integer foreign key (id) references Artist) inherits (Artist);
create table Track (parent integer foreign key (id) references Album) inherits (Artist);

我同意勒dorfier,你可能会得到一些重复使用了这一概念的一个基本实体(ID,Name),但超越这一点的概念,艺术家、唱片和轨道会出现分歧。

和一个更加现实的模型将可能需要处理的事实,多家可能有助于一个单一的轨道上一张专辑...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top