Language agnostic DB设计:喜欢抽象还是外键约束?

Language agnostic DB设计:喜欢抽象还是外键约束?,language-agnostic,database-design,oop,entity-relationship,Language Agnostic,Database Design,Oop,Entity Relationship,假设我们有这样一个场景: Artist ==< Album ==< Track //ie, One Artist can have many albums, and one album can have many tracks 您对上述设计有何看法?在这个DB场景中加入“OOP概念”有意义吗 最后,您更喜欢使用第一个场景的外键约束还是更通用的方法(例如,存在将艺术家与曲目链接的风险,因为没有检查以查看输入者外键值是否真的属于专辑)呢 …顺便说一句,仔细想想,我认为你可以检查艺术家

假设我们有这样一个场景:

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

您对上述设计有何看法?在这个DB场景中加入“OOP概念”有意义吗

最后,您更喜欢使用第一个场景的外键约束还是更通用的方法(例如,存在将艺术家与曲目链接的风险,因为没有检查以查看输入者外键值是否真的属于专辑)呢


…顺便说一句,仔细想想,我认为你可以检查艺术家的RelField的输入值是否对应于一张专辑,可能有触发器吗?

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

我不认为你会在常规的OO设计中把这些实体混为一谈


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

几乎不可能不可避免地在各个实体上累积额外的字段。如果不以一种相当接近的方式反映现实,那将一无所获

我不认为你会在常规的OO设计中把这些实体混为一谈


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

我最近看到了这种抽象概念的一致实现,应用程序及其数据库成了维护和故障排除的庞然大物。我将远离这种技术。越简单越好,这是我的座右铭。

我最近看到这种抽象概念得到了一致的实现,应用程序及其数据库变成了一个需要维护和故障排除的怪物。我将远离这种技术。越简单越好,这是我的信条。

我同意勒多菲尔的观点,你可能会从基本实体(ID、名称)的概念中得到一些重用,但超出这一点,艺术家、专辑和曲目的概念将出现分歧


一个更现实的模型可能需要处理这样一个事实,即多个艺术家可能会对一张专辑中的一首曲目做出贡献…

我同意le dorfier的观点,你可能会从基本实体(ID、名称)的概念中获得一些重用,但超出这一点,艺术家、专辑和曲目的概念将有所不同


一个更现实的模型可能需要处理这样一个事实,即多个艺术家可能会对一张专辑中的一首曲目做出贡献…

通过将这三首歌拼凑在一起,您的查询的可读性会降低(除非随后将这三个类别分解为视图),搜索和索引也会变得更加困难

另外,在某些时候,您可能会希望向一个类别添加属性,而这些属性不是其他类别的属性。将这三者结合在一起,在不破坏系统的情况下,就没有改变的余地


别那么聪明,把自己绊倒了

将这三个类别组合在一起,会降低查询的可读性(除非随后将这三个类别分解为视图),也会增加搜索和索引的难度

另外,在某些时候,您可能会希望向一个类别添加属性,而这些属性不是其他类别的属性。将这三者结合在一起,在不破坏系统的情况下,就没有改变的余地


别那么聪明,把自己绊倒了

我能看到的以面向对象的方式进行此操作的唯一优势是,如果将来添加了其他元素类型(即艺术家、专辑和曲目除外)。在这种情况下,您不需要更改模式

然而,我倾向于选择非OOP方式,在这种情况下只需更改模式。OOP解决方案存在的一些问题有:

  • 如果要添加艺术家的生日,该怎么办
  • 如果要存储相册和曲目的持续时间,该怎么办
  • 如果要存储轨迹类型,该怎么办

基本上,如果您只想存储一种或两种元素类型的特定元素,该怎么办?

我能看到的以面向对象的方式进行存储的唯一优势是,如果将来添加了其他元素类型(即艺术家、专辑和曲目除外)。在这种情况下,您不需要更改模式

然而,我倾向于选择非OOP方式,在这种情况下只需更改模式。OOP解决方案存在的一些问题有:

  • 如果要添加艺术家的生日,该怎么办
  • 如果要存储相册和曲目的持续时间,该怎么办
  • 如果要存储轨迹类型,该怎么办

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

如果您了解这类内容,请查看中的表继承


如果您对这类事情感兴趣,那么看看中的表继承


你的专辑中没有多个艺术家吗?你的曲目都没有多个艺术家吗?你也不会录制诸如演奏音乐的乐队(管弦乐队)、独奏家、指挥家、作曲家、编曲等。啊,这只是个问题,但要小心过度简化。你的专辑中没有多个艺术家吗?你的曲目都没有多个艺术家吗?你也不会录制诸如演奏音乐的乐队(管弦乐队)、独奏家、指挥家、作曲家、编曲等。啊,这只是一个问题,但要小心过度简化。这种抽象的最终目的是EAV模型(实体、属性、值),在这种模型中,任何东西都可以塞进一个表中,只有三列。无论主题如何变化,模式永远不会改变。它是
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. 
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);