首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新闻数据库设计

新闻数据库设计
EN

Stack Overflow用户
提问于 2012-11-30 21:42:21
回答 3查看 12.2K关注 0票数 2

我正在制作一个新闻网站,但我想让用户插入从Facebook状态。用户可以在编写状态时将状态放在新闻中的任何位置。我想在插入的时候显示新闻。

以下是新闻内容的一个例子

“某些用户插入文本状态-其他文本-另一种状态-另一种状态-”

所以我在想,在这种情况下,什么是一个好的数据库设计。状态有用户,谁写了它,日期和内容。新闻有标题、描述和日期。

我想出了五张桌子。

NewsHeader

代码语言:javascript
复制
id  
NewsTitle  
NewsDesc  
NewsDate
User

NewsContent -只包含来自新闻状态或文本的id和消息。

代码语言:javascript
复制
id  
content

NewsContentDetails -包含状态的详细信息

代码语言:javascript
复制
id
ContentUser
ContentDate

NewsContentDetailsLink - NewsContentNewsContentDetails的连接表

代码语言:javascript
复制
NewsContentId  
NewsContentDetailsId

NewsHeaderContent - NewsHeaderNewsContent的连接表

代码语言:javascript
复制
NewsHeaderId  
NewsContentId

这是一个好的数据库设计,还是有更好的方法来做到这一点?我担心在显示新闻时,我必须在sql查询中编写许多联接,这将是缓慢的。

编辑: @hrr建议的DB设计

新闻:** ID \ Title \ Content \ User = Date **要素:** ID \\ Content \ User \ Date \ News_ID

但是元素中的一些字段将是空的,我认为这不是一个好的选择。

(预先谢谢:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-07 14:06:00

您不需要NewsHeaderContent,除非您希望在多个标题中使用相同的内容,但我认为您不需要它,所以您可以使用两个表:

NewsHeader

代码语言:javascript
复制
id  
NewsTitle  
NewsDesc  
NewsDate

NewsContent

代码语言:javascript
复制
NewsId
ContentId  
Sequence
content
ContentUser
ContentDate

您可以使用字段Sequence对内容进行排序。

这个结构中的一些数据的一个例子:

NewsHeader

代码语言:javascript
复制
id    NewsTitle       NewsDesc               NewsDate
 1    'First News'    'Some Description'     2012-10-07
 2    'Another News'  'Description of News'  2102-12-07

NewsContent

代码语言:javascript
复制
NewsId  ContentId   Sequence  content                    ContentUser  ContentDate
     1          1          1  'Some Text'                       NULL      NULL
     2          1          1  'Some user inserted text'         NULL      NULL
     2          2          2  [Status]                         User2  2012-12-07
     2          3          4  [Some other status]              User2  2012-12-07
     2          4          3  'Some other text'                 NULL      NULL
     2          5          5  'another text'                    NULL      NULL
     2          6          6  [Another Status]                 User2  2012-12-07

序列可以被更改,因为ContentUser和ContentDate只在状态时使用,那么您可以使用这些字段来标识文本或状态,或者可以添加一个归档的Type,例如文本的T和状态的S

这里是我的例子的一个SQLFiddle:SQLFiddle

票数 2
EN

Stack Overflow用户

发布于 2012-11-30 21:46:49

您可以使用一个表作为新闻,一个表用于元素。

新闻:

代码语言:javascript
复制
ID | Title | Content | User | Date

元素:

代码语言:javascript
复制
ID | Content | User | Date | News_ID

每个元素都会有自己的新闻id!不需要创建额外的“连接”表。

票数 0
EN

Stack Overflow用户

发布于 2012-12-13 19:21:33

我认为,如果您想让read操作非常快(我假设它是一个新闻站点),那么以下设计可能是正确的:

表的总体设计:

  1. 我不认为有理由把新闻内容和新闻标题分开?因此,我假设它是一个映射(即使不是这样,解决方案也不会有很大变化)。所以我只需要一个新闻表格 新闻 id _ Title _
  2. 接下来我会有一个UserStatus表 UserStatus id -用户Id -用户Id-状态文本

当用户想要创建一条新闻消息,如您指出的“某些用户插入文本状态-其他文本-另一种文本-另一种状态-另一种状态”时,他/她可以简单地为每个句子片段选择新闻和/或状态。

在用户创建一个句子之后,您可以获取相关的内容新闻和状态ans,直接将形成的消息存储在一个表中,因此您将有一个为read优化的消息表:

代码语言:javascript
复制
Message
id | message | User id | DateTime

缺点是,您可以通过状态或新闻id进行筛选,如果消息或状态发生更改,也不能更新消息。

如果我们假设允许用户更改新闻或状态,或者希望通过新闻id或状态id筛选消息,那么另一种选择是:

存储新闻ids的映射和已引用新闻的消息ids,以及状态ids的映射,以及与片段序列号一起引用状态的消息ids。所以你会:

代码语言:javascript
复制
News-Message-Mapper
News Id | Message Id | Fragment Sequence

代码语言:javascript
复制
Status-Message-Mapper
Status Id | Message Id | Fragment Sequence

片段序列表示状态或消息在整个消息中出现的位置。

现在,如果更新或删除了一个消息或状态,您只需引用两个映射表,或者重新生成这些消息,或者删除它们。

这优化了读取,但是更新很复杂,但是您的引用完整性和规范化规则得到了维护。此外,您还可以通过新闻id或状态id筛选消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13653618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档