Mysql 一个图像表可以服务于两个外部表?
我有这个Mysql 一个图像表可以服务于两个外部表?,mysql,database-design,relational-database,foreign-key-relationship,Mysql,Database Design,Relational Database,Foreign Key Relationship,我有这个图像表 image_id image_title image_description image_source 我希望这个图像表与页面表关联,有时与注释表 页表 page_id ... ... 注释表 comment_id ... ... 我是否应该将页面id和注释id的外键放在图像表格中 image_id image_title image_description image_source page_id comment_id 或者我应该为每个目的创建一个map表吗 图像和页面
图像表
image_id
image_title
image_description
image_source
我希望这个图像表
与页面表
关联,有时与注释表
页表
page_id
...
...
注释表
comment_id
...
...
我是否应该将页面id
和注释id
的外键放在图像
表格中
image_id
image_title
image_description
image_source
page_id
comment_id
或者我应该为每个目的创建一个map
表吗
图像和页面的map
表格
image_id
page_id
另一张map
表格用于图像和注释
image_id
comment_id
对于这种情况,最佳实践是什么
当图像
表格行增加时,如果我使用映射
思想,图像
表格是否会变慢(这是另一个主要问题)
现在我做这个,
图像页面
表格
image_id
image_title
image_description
image_source
page_id
image_id
image_title
image_description
image_source
comment_id
图像注释
表格
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
您的图像表很好。您应该创建一个注释表和一个页面表,并将图像ID存储在这些表中 编辑:(没有阅读所有评论)
根据页面和评论可以有多个图像的要求,唯一的方法是创建两个链接表,一个链接评论到图像,另一个链接页面到图像,目前的设计存在局限性。例如,图像不能同时与页面和注释相关。除非其数据在两个图像表中重复。第二,也是更重要的一点(正如您所说,它看起来不太好),您有两个几乎相同的列和功能的表 因此,有一个
图像表和两个映射表看起来更好。如果您以后想存储更多(和不同)关于这些映射的信息-例如,您可能想添加上次更改的时间戳和PageImage
的大小限制(每个图像最大100KB)和CommentImage
的数量限制(每个注释最多3个)-您不必更改总体设计,只有这两个特定的映射表
但是,您可能会发现自己创建了一组映射表,比如一个用于UserImage
,另一个用于MessageImage
,还有一个用于EmailImage
,所有这些表都具有相同(或几乎相同)的结构,这又导致了代码的重复
要消除这种重复,可以使用超类型/子类型模式。创建一个超类型实体
,将页面
,注释
,用户
,消息
,电子邮件
作为子类型(每个子实体都有一个主键,也是超类型实体
的外键)
然后,您的映射可以很容易地组合到一个EntityImage
表中(使用FKs到Image
和Entity
)。您所说的有时是什么意思?现在还不清楚是什么型号或问题。嗨,马特,请看我上面的编辑。希望它有意义。谢谢。“我应该为每个目的创建一个映射表吗?”这取决于一个页面/评论中是否可以有多个图像;如果是这样,那就有道理了。我曾经对联系人数据这样做过一次,可以分配给用户或公司。是的,一个页面/评论中应该允许有多个图像…OP声明(在评论中):“一个页面/评论中应该允许有多个图像。”Yikes,那么我的回答无效。在这种情况下,需要有两个链接表,一个用于注释,一个用于页面。谢谢,非常感谢你的回答。我能问一下-什么是超类型/子类型模式?它与我的OP中的映射
表有什么区别?来自另一个问题:各方
有你的实体
。个人
,组织
表格中有您的页面
和注释
。创建超类型后,可以建立其他表与它之间的关系(1对多、1对1、多对多等等)。因此,您正在与所有子类型实体的联合建立关系。感谢您的回复。这对我来说是新的。我会花更多的时间去消化它。但是谢谢!