1

我正在尝试创建一个壁纸共享库,我希望我的访问者能够对壁纸和文章发表评论。

假设我有以下表格:

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 将其上传到免费的 Web 主机服务上。

请问您知道有什么明确的方法吗?提前致谢。

编辑:感谢大家的回答。

4

3 回答 3

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)

优点:您不必修改架构来评论其他实体类型
缺点:没有参照完整性(尽管可以通过触发器强制执行)

于 2012-09-11T19:38:32.867 回答
1

我会做一些简单的事情,比如在名为 type 的 Comment 表中添加一个字段,使其成为 Tinyint。然后在存储评论时,要么设置为 0,要么设置为 1,选择哪种类型,即 0 是否为文章的壁纸。

于 2012-09-11T19:37:36.177 回答
1

我建议在您的评论表中添加一个类型字段。您可以使用“ARTICLE”或“WALLPAPER”之类的字符串填充它,或者创建一个参考表。就像是:

Type_Ref
- id
- desc

Type_Ref 将包含自动递增的主键,以及墙纸或文章的描述。

然后在您的评论表中,您将只有一个 Type_Ref_Id 字段,并带有相应的 id。然后,每当您需要添加新的类型进行投票时,您只需向 ref 表添加一个条目即可。

于 2012-09-11T19:39:47.683 回答