1

假设我们有这种情况:

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

在这种情况下,所有 3 个实体都具有基本相同的字段:

  • ID
  • 姓名
  • 与相应子代(Artist to Album 和 Album to Track)的一对多关系的外来物

所提供解决方案的典型解决方案是三个表,在一对多关系字段中具有相同的字段(ArtistID、AlbumID 等)和外键约束。

但是,在这种情况下,我们可以合并一种继承形式来避免相同字段的重复吗?我说的是这样的事情:

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. 

你觉得上面的设计怎么样?在这个数据库场景中加入“OOP 概念”是否有意义?

最后,您更喜欢第一种情况的外键约束还是更通用的(例如,存在将艺术家与 Track 链接的风险,因为没有检查输入器外键值是否真的是一张专辑)的方法?

..btw,想想看,我想你实际上可以检查一个艺术家的 RelField 的输入值是否对应一个专辑,也许有触发器?

4

6 回答 6

5

我最近看到这种抽象的想法被一致地实现了,应用程序及其数据库变成了一个需要维护和排除故障的怪​​物。我会远离这种技术。越简单越好,这是我的口头禅。

于 2009-04-08T03:14:53.450 回答
2

不可避免地会在各个实体上累积的额外字段几乎没有机会如此有责任感。如果不以相当接近的方式反映现实,将一无所获。

我认为您甚至不会在常规的 OO 设计中将这些实体混为一谈。

这让我(但只是轻微地)想起了我曾经看到的尝试在一个表(名为“实体”)中实现所有内容,另一个表(名为“属性”)和它们之间的连接表。

于 2009-04-08T03:13:06.310 回答
1

通过将这三者结合在一起,您的查询的可读性会降低(除非您随后将这三个类别分解为视图),并使搜索和索引变得更加困难。

另外,在某些时候,您会希望将属性添加到一个类别,而这些属性不是其他类别的属性。将这三者结合在一起,你就没有改变的余地,而不会破坏系统的大部分内容。

不要太聪明,你会绊倒自己。

于 2009-04-08T03:17:27.127 回答
1

我可以看到以您的 OOP 方式执行此操作的唯一优势是将来是否添加了其他元素类型(即,除了艺术家、专辑和曲目之外)。在这种情况下,您不需要更改架构。

但是,我倾向于选择非 OOP 方式并在这种情况下更改架构。OOP 解决方案存在的一些问题是:

  • 如果要添加艺术家的生日怎么办?
  • 如果你想存储专辑和曲目的持续时间怎么办?
  • 如果要存储轨道类型怎么办?

基本上,如果您想存储仅针对一种或两种元素类型的特定内容怎么办?

于 2009-04-08T03:17:43.663 回答
1

如果你喜欢这种事情,那么看看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);
于 2009-04-08T03:28:25.913 回答
0

我同意 le dorfier 的观点,您可能会从基本实体(ID、名称)的概念中得到一些重用,但除此之外,Artist、Album 和 Track 的概念会有所不同。

一个更现实的模型可能必须处理多个艺术家可能为一张专辑的单首曲目做出贡献的事实......

于 2009-04-08T03:16:05.837 回答