我有这个图像表
,
image_id
image_title
image_description
image_source
我希望此图像表
与页表
关联,并且有时与注释表
关联
页表,
page_id
...
...
评论表,
comment_id
...
...
我应该将page_id
和comment_id
的外键放在image
表中吗?
image_id
image_title
image_description
image_source
page_id
comment_id
或者我应该为每个目的创建一个map
表?
图像和页面的map
表
image_id
page_id
以及另一个用于图像和评论的map
表
image_id
comment_id
这种场景的最佳实践是什么?
如果我在image
表格行时使用map
想法,image
表格会变慢吗?增加(这是另一个主要问题)?
目前我正在这样做,
图像页面
表格,
image_id
image_title
image_description
image_source
page_id
图像评论
表,
image_id
image_title
image_description
image_source
comment_id
但这看起来不太好,因为我重复了这些列,而且它似乎不是动态的......
有什么想法吗?
编辑:
有时图像与页面相关联,有时与评论相关联。上传图片有时是针对文章本身,有时是针对文章下方的评论。
image_id image_title page_id comment_id
1 a 1 NULL
2 b NULL 1
3 c 1 NULL
4 d 1 NULL
最佳答案
您现在的设计存在局限性。例如,图像不能同时与页面和评论相关。除非它的数据在两个Image表中重复。其次,更重要的是(正如您所说,它看起来不太好),您有两个具有几乎相同的列和功能的表。
因此,拥有一个 Image
表和两个映射表看起来是更好的设计。如果您稍后想要存储有关这些映射的更多(和不同)信息 - 例如,您可能需要添加 Last_changed 时间戳和 PageImage
的大小限制(每个图像最大 100KB)以及数量限制对于 CommentImage
(每个评论最多 3 个)- 您不必更改整体设计,只需更改这 2 个特定映射表即可。
但是,您可能会发现自己创建了一堆映射表,例如一个用于 UserImage
,另一个用于 MessageImage
,另一个用于 EmailImage
,都具有相同(或几乎相同)的结构 - 这再次导致代码重复。
要消除此类重复,您可以使用父类(super class)型/子类型模式。创建一个父类(super class)型 Entity
,其中包含 Page
、Comment
、User
、Message
、Email
作为子类型(每个子实体都有一个主键,它也是父类(super class)型 Entity
的外键)。
然后,您的映射可以轻松地合并到一个 EntityImage
表中(带有到 Image
和 Entity
的 FK)。
关于mysql - 一个图像表可以服务两个外部表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381261/