新闻系统的数据库模式

时间:2012-05-18 18:19:28

标签: php mysql database database-design schema

我有一个我正在设计的新闻系统,起初看起来很简单,但是当我推进我的计划架构时,我遇到了问题......显然我没有想过。有人可以帮忙吗?

系统要求从数据库中获取最新的20篇新闻文章。这样就像博客一样。每篇文章都可以包含可以从父文章访问的子文章(通常大约3个)。只有当父文章可见时才能看到子文章 - 它们不会在其他地方使用。

客户需要能够隐藏/显示新闻文章(简单),但如果他们愿意(更难),也可以改变他们的订单。

我最初将子文章存储在一个单独的表中,但后来我意识到这些字段基本相同:标题,复制,图像。那么为什么不把它们全部放在一张大桌子上呢?

现在我遇到了有关订购的其他问题。现在是星期五晚上,我的头疼了!

有人可以提供建议吗?

感谢。


更新:人们要求查看我的“现有”架构:

articleID *   
headline  
copy
imageURL
visible
pageOrder

subArticleID *
articleID 
headline
copy
imageURL
visible
pageNumber
pageOrder

这会有用吗?我如何让用户更改订单?对我来说这似乎是错误的方式,所以我把它扔掉了。

5 个答案:

答案 0 :(得分:2)

  

我最初将子文章存储在一个单独的表中,但后来我意识到这些字段基本相同:标题,复制,图像。那么为什么不把它们全部放在一张大桌子上呢?

因为参照完整性不一样。

当然,也就是说,如果要将树限制为2个级别。如果您想要更通用的数据模型(即使这意味着稍后在应用程序级别限制它),那么继续创建一般树。

这可能看起来像这样:

enter image description here

注意PARENT_ARTICLE_ID和ORDER是否都是NULL(因此你可以表示一个根)以及两者如何构成上图中由U1表示的UNIQUE约束(所以在这下面没有两个文章可以模糊地排序)同一个父母)。

答案 1 :(得分:2)

根据您所描述的内容。我会用两张桌子。第一个表格将包含所有文章和子文章。第二个将文章与他们的子文章联系起来。

第一个表(称之为articles)可能包含以下列:

+-----------+----------+------+----------+---------+------------+-----------+
| articleID | headline | copy | imageURL | visible | pageNumber | pageOrder |
+-----------+----------+------+----------+---------+------------+-----------+

第二个表(称之为articleRelationships)可能包含以下列:

+-----------------+----------------+
| parentArticleID | childArticleID |
+-----------------+----------------+

不确定您是否已使用pageNumber列完成此操作,但如果没有,则可以为articleLevel添加一个列,并为主要文章提供类似于1的内容,为sub提供2 - 主要文件的文件,第2级文章的子文章,等等。这样,当选择最近的20篇文章时,你只需从articleLevel = 1的表中选择。

我认为在每篇文章中存储日期/时间可能也很有用,这样你就可以按顺序排序。至于任何其他排序,你必须澄清更多关于我的更多帮助。

要为用户显示它们,我会使用AJAX。我首先会在屏幕上显示最新的20篇主要文章,然后当用户选择查看特定文章的子文章时,使用AJAX调用数据库并执行如下查询:

SELECT a.articleID, a.headline
FROM articles a
    INNER JOIN articleRelationships ar ON a.articleID = ar.childArticleID
WHERE ar.parentArticleID = ? /* ? is the articleID that the user clicked */
ORDER BY articleID

答案 2 :(得分:1)

  

客户端需要能够隐藏/显示新闻文章(简单),但是   如果他们愿意(更难),也会改变他们的秩序。

在这一点上,您需要在表中存储特定于客户端的排序。具体如何做到这一点将部分取决于您如何选择处理文章和子文章。沿着这些方向的东西将适用于文章。

client_id   article_id   article_order
-- 
1           1067         1
1           2340         2
1             87         3
...

您可能需要对表名和列名进行一些调整。

create table client_article_order (
  client_id integer not null,
  article_id integer not null,
  article_order integer not null,
  primary key (client_id, article_id),
  foreign key (client_id) references clients (client_id) on delete cascade,
  foreign key (article_id) references articles (article_id) on delete cascade
) engine = innodb;

虽然我将article_order设为整数,但您可以使用其他数据类型。你可以使用float,double或甚至varchar(n)。重新排序可能很麻烦。


如果您不需要客户端ID,则可以在文章表中存储文章订购。

但这听起来越来越像Drupal和Wordpress开箱即用的东西。是否有令人信服的理由重新发明这个轮子?

答案 3 :(得分:0)

在新闻(文章)表格中创建一个新字段" parent"其中包含父文章的新闻ID。这个新字段将用作文章和子文章之间的连接。

答案 4 :(得分:0)

由于SlideID“拥有”SubSlideID,我会为第二个表使用复合主键。

PrimaryKey: slideID, subSlideID
Other index: slideID, pageNumber, pageOrder   (Or however they get displayed)

我更喜欢指出一篇博文是http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx,因为它解释了为什么非常好。

如果您要回复Auto_Increment,也可以处理(使用MyISAM表),您仍然可以将subSlideID设置为auto_increment。

如果您可能会进入第三级然后合并 - 请按照上面的Branko进行操作。但它确实开始变得非常复杂,因此仅保持2层分开。