4

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

系统要求从数据库中抓取最新的 20 篇新闻文章。它以这种方式类似于博客。每篇文章都可以有可以从父文章访问的子文章(通常在 3 个左右)。子文章仅在父文章可见时才可见——它们不会在其他地方使用。

客户需要能够隐藏/显示新闻文章(简单),但如果他们愿意(更难),还需要更改它们的顺序。

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

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

任何人都可以提供建议吗?

谢谢。


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

articleID *   
headline  
copy
imageURL
visible
pageOrder

subArticleID *
articleID 
headline
copy
imageURL
visible
pageNumber
pageOrder

这行得通吗?我将如何让用户更改订单?对我来说,这似乎是错误的做法,所以我把它扔掉了。

4

5 回答 5

2

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

因为参照完整性是不一样的。

也就是说,当然,如果您想将树限制为恰好 2 个级别。如果您想要更通用的数据模型(即使这意味着稍后在应用程序级别对其进行限制),那么请继续制作通用树。

这可能看起来像这样:

在此处输入图像描述

请注意 PARENT_ARTICLE_ID 和 ORDER 如何都可以为 NULL(因此您可以表示根),以及两者如何构成U1上图中表示的 UNIQUE 约束(因此不能在同一个父项下对两篇文章进行模糊排序)。

于 2012-05-18T20:47:05.237 回答
2

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

第一个表(调用它articles)可能有这些列:

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

第二个表(称为它articleRelationships)可能有这些列:

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

不确定您是否已经通过该pageNumber列完成此操作,但如果没有,您可以添加一个类似的列,articleLevel并给它类似 1 的主要文章,2 用于主要文章的子文章,3 用于子文章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
于 2012-05-22T12:40:13.493 回答
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 开箱即用的东西。是否有令人信服的理由来重新发明这个轮子?

于 2012-05-22T12:17:10.703 回答
0

在 news(article) 表“parent”中创建一个新字段,该字段将包含父文章的新闻 id。这个新字段将用作文章和子文章之间的连接。

于 2012-05-18T18:28:35.317 回答
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 层。

于 2012-05-22T11:13:36.143 回答