这种实体关系能否更加规范化

时间:2012-08-01 19:08:12

标签: sql entity-relationship erd class-table-inheritance

N Artists have M Folders.
1 Folder has N Sketches.

艺术家

ArtistId (PK)

ArtistFolder

ArtistId (PK)(FK)
FolderId (PK)(FK)

文件夹

FolderId (PK)

草图

SketchId (PK)
FolderId (FK)

我现在想要的是:

1艺术家有N个草图。

我必须在表Sketch:ArtistId

中添加一个新字段

当我为文件夹插入草图时,此字段将始终为空/ null。

你知道有更好的设计吗?

1 个答案:

答案 0 :(得分:0)

我不明白为什么Sketches会同时给出artistId和folderId,但我显然不知道你在创作什么。

在我看来,你有多种类型的草图。一些草图由艺术家和其他实体“创造”。无论哪种方式,他们都有一个文件夹。所以,如果你不喜欢null值,你可以这样做。

<强>草图

SketchId (PK)
FolderId (FK)

然后:

<强> ArtistSketch

SketchId (FK)
ArtistId (FK)

然后你可以对ArtistSketch有一个禁止重复草图的约束。

要获得给定艺术家的草图,您可以在两个表中进行连接以获得:

SketchId
ArtistId
FolderId

否则,只需查询Sketch表。

这将是类表继承的示例:http://martinfowler.com/eaaCatalog/classTableInheritance.html

Doctrine,一个用于PHP的ORM库有一个有趣的用途,用于与MySQL一起使用,以减少在许多设置下正常工作所需的不幸数量繁重(代码方式)。 http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html