我正在尝试创建一个壁纸共享库,我希望我的访问者能够在壁纸和文章上发表评论。
假设我有以下表格:
Wallpaper
- id
- name
- etc...
Article
- id
- title
- etc...
Comment
- id
- text
我希望将评论与独特的壁纸或独特的文章相关联。
我考虑过像这样继承:
Commentable
- id
Article
- id references Commentable.id
- etc...
Wallpaper
- id references Commentable.id
- etc...
Comment
- id
- commented references commentable.id
但这种方法看起来很重,并不是很好。
我也想过制作:
Wallpaper
- id
- name
- etc...
Article
- id
- title
- etc...
Comment
- id
- commented references either Wallpaper.id or Article.id
但是没有办法知道相关的东西是壁纸还是文章。
我也想使用MyISAM而不是InnoDB,因为我会将它上传到带有5.1 MySQL的免费网络主机服务上。
你知道有任何明确的方法吗?提前谢谢。
编辑:感谢大家的回答。
答案 0 :(得分:3)
有两种选择:
选项一
Wallpaper
- id
- name
Article
- id
- title
Comment
- id
- wallpaper_id <== FK
- article_id <== FK
优点:参考完整性
缺点:您必须修改架构以评论其他实体类型
选项二
Wallpaper
- id
- name
Article
- id
- title
Comment
- id
- entity_id <== either a wallpaper id or article id
- entity_type <== one of 'wallpaper' or 'article' (use lookup table if you wish)
优点:您不必修改架构来评论其他实体类型 缺点:没有参照完整性(尽管可以通过触发器强制执行)
答案 1 :(得分:1)
我会选择一个简单的方法,例如在名为type的Comment表中添加一个字段,使其成为Tinyint。然后在存储评论时,你要么设0或1,选择哪种类型,所以0是否是文章的壁纸。
答案 2 :(得分:1)
我建议在Comment表中添加一个类型字段。您可以使用“ARTICLE”或“WALLPAPER”之类的字符串填充它,或者创建一个ref表。类似的东西:
Type_Ref
- id
- desc
Type_Ref将包含自动递增的主键,以及Wallpaper或Article的描述。
然后在你的评论表中,你只有一个Type_Ref_Id字段,并带有相应的id。然后,每当您需要添加一个新类型进行投票时,您只需在ref表中添加一个条目。