mysql - 一个图像表可以服务两个外部表?

标签 mysql database-design relational-database foreign-key-relationship

我有这个图像表

image_id
image_title
image_description
image_source

我希望此图像表页表关联,并且有时与注释表关联

页表,

page_id
...
...

评论表,

comment_id
...
...

我应该将page_idcomment_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,其中包含 PageCommentUserMessageEmail 作为子类型(每个子实体都有一个主键,它也是父类(super class)型 Entity 的外键)。

然后,您的映射可以轻松地合并到一个 EntityImage 表中(带有到 ImageEntity 的 FK)。

关于mysql - 一个图像表可以服务两个外部表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381261/

相关文章:

mysql - 并发更新 MySQL 与 PostgreSQL?

database-design - 您是否应该复制数据?

mysql - 当自动递增列用完时会发生什么?

database-design - 在 MongoDB 中建模投票系统的最佳方法

mysql - 学生出勤表结构

php - Laravel Eloquent 扩展模型

php - 无法创建正确的查询

mysql - Laravel 架构默认值函数

php - paypal IPN php 脚本- mysql 不工作?

mysql - 数据库如何处理冗余值?