我有一个我正在设计的新闻系统,起初看起来很简单,但是当我推进我的计划架构时,我遇到了问题......显然我没有想过。有人可以帮忙吗?
系统要求从数据库中获取最新的20篇新闻文章。这样就像博客一样。每篇文章都可以包含可以从父文章访问的子文章(通常大约3个)。只有当父文章可见时才能看到子文章 - 它们不会在其他地方使用。
客户需要能够隐藏/显示新闻文章(简单),但如果他们愿意(更难),也可以改变他们的订单。
我最初将子文章存储在一个单独的表中,但后来我意识到这些字段基本相同:标题,复制,图像。那么为什么不把它们全部放在一张大桌子上呢?
现在我遇到了有关订购的其他问题。现在是星期五晚上,我的头疼了!
有人可以提供建议吗?
感谢。
更新:人们要求查看我的“现有”架构:
articleID *
headline
copy
imageURL
visible
pageOrder
subArticleID *
articleID
headline
copy
imageURL
visible
pageNumber
pageOrder
这会有用吗?我如何让用户更改订单?对我来说这似乎是错误的方式,所以我把它扔掉了。
答案 0 :(得分:2)
我最初将子文章存储在一个单独的表中,但后来我意识到这些字段基本相同:标题,复制,图像。那么为什么不把它们全部放在一张大桌子上呢?
因为参照完整性不一样。
当然,也就是说,如果要将树限制为2个级别。如果您想要更通用的数据模型(即使这意味着稍后在应用程序级别限制它),那么继续创建一般树。
这可能看起来像这样:
注意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层分开。