【问题标题】:comments as normal nodes in database评论作为数据库中的普通节点
【发布时间】:2013-05-21 16:59:24
【问题描述】:

我不是数据库专家。所以我只是作为初学者问它。 我要设计一个数据库,但是我不确定我在数据库设计中所做的是对还是错。 该网站应包含文章和帖子,每个帖子可能有多个 cmets。 我决定将所有文章、帖子和用户个人资料视为节点。 所以我创建了一个名为“节点”的表,每个“节点”都有一个“内容”作为文本。 现在我正在考虑是否应该将评论视为“节点”,或者我应该将不同的表作为“comment_nodes”。 我正在寻找有效的方法。

所以,一句话:把cmets当作普通节点可以吗?

谢谢

【问题讨论】:

  • 你在使用 NoSQL 基于文档的数据库吗?
  • 我将通过 CodeIgniter 或 CakePHP 使用 MySQL 来实现它

标签: database database-design content-management-system database-schema


【解决方案1】:

这称为表继承,这不是一个坏主意。例如,在 Drupal 中,大多数东西都是一个“节点”。

主要优点是它可以让外键指向稍微不同的东西(相同的父类型)。

在您的情况下,我会使用类表继承。你可以这样做:

NODE
id

NODE_POST
id pk fk node(id)
title
body

NODE_COMMENT 
id pk fk node(id) 
body 
post_id fk node_post(id) 
parent_comment_id fk node_comment(id)

无论如何,请在 Google 上为 Martin Fowler 提供有关表继承的信息,并确保您了解其中的含义。

如果您使用的是 PHP,那么 Doctrine 将帮助您解决继承问题。

如果您要使用嵌套的 cmets,我也会推荐 Postgres 而不是 MySQL,因为 Postgres 的分层查询比 MySql 更好。

【讨论】:

  • 非常感谢。将body放在节点表中怎么样?合理吗?
  • 如果所有子类型都有主体,那么是的。
【解决方案2】:

如果您使用 MySQL,那么您的设计是不正确的。

基本上,您必须以表格、列和行的形式来考虑数据。每个表都应该代表一个业务实体,而不是抽象的东西。列表示业务实体的属性,行是项(业务实体的实例)。您需要定义主键和外键。

您需要为列指定适当的类型并定义索引以允许快速搜索。

举个例子

================================== |后桌 | ================================== |编号 |标题 |身体 | ================================== |评论表 | ================================== |标识 |帖子编号 |正文 |

我将从 MySQL 的基本教程开始(虽然不推荐)。如果这个答案太基本,请道歉。

【讨论】:

  • 感谢您的回答。如果我对您的理解正确,我也应该为用户个人资料、文章等制作不同的表格。并重复这些字段。另一个问题是,评论不一定是指帖子,我也必须添加comment_type。我说的对吗?
  • 是的,没错。您还需要弄清楚实体之间的关系:1 to 11 to NN to N。这也会影响您的设计。
  • 好的,我会把它们分开。这个设计怎么样?还是有问题吗? ===================================|后桌 | ===================================|编号 |标题 |节点 ID | ===================================|评论表 | ==================================|id |帖子编号 | Node_id |
猜你喜欢
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多