新闻数据库设计

时间:2012-11-30 21:42:22

标签: sql database database-design data-modeling

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

以下是新闻'内容

的示例
  

“某些用户插入了文字状态其他一些文字其他一些状态另一种文字另一种状态

所以我想在这种情况下什么是好的数据库设计。状态包括用户,编写过的用户,日期和内容。新闻有标题,描述和日期。

我想出了五张桌子。

NewsHeader

id  
NewsTitle  
NewsDesc  
NewsDate
User

NewsContent - 仅包含ID和来自新闻状态或文本的消息

id  
content

NewsContentDetails - 包含状态的详细信息

id
ContentUser
ContentDate

NewsContentDetailsLink - NewsContent NewsContentDetails

的联结表
NewsContentId  
NewsContentDetailsId

NewsHeaderContent - NewsHeader NewsContent

的联结表
NewsHeaderId  
NewsContentId

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

修改 @hrr

建议的数据库设计
**News:**
     

ID |标题|内容|用户|日期

**Elements:**
     

ID |内容|用户|日期| News_ID

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

提前致谢:)

3 个答案:

答案 0 :(得分:3)

你不需要NewsHeaderContent,除非你想在多个标题中使用相同的内容,但我不相信你想要它,所以你可以使用两个表:

NewsHeader

id  
NewsTitle  
NewsDesc  
NewsDate

新闻内容

NewsId
ContentId  
Sequence
content
ContentUser
ContentDate

您可以使用字段Sequence来订购内容。

此结构中的一些数据示例:

<强> NewsHeader

id    NewsTitle       NewsDesc               NewsDate
 1    'First News'    'Some Description'     2012-10-07
 2    'Another News'  'Description of News'  2102-12-07

<强> NewsContent

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

答案 1 :(得分:1)

您可以将一个表用于新闻,将一个表用于Elements。

新闻:

ID | Title | Content | User | Date

<强>元素:

ID | Content | User | Date | News_ID

每个元素都有自己的新闻ID!无需创建额外的“结点”表。

答案 2 :(得分:1)

我认为如果您希望读取操作非常快(我假设它会假设它是一个新闻站点),可能以下设计会很好:


整体桌面设计: enter image description here

  1. 我没有理由将新闻内容和新闻标题分开?所以我假设它是一对一的映射(即使不是这种情况,解决方案也不会改变很多)。所以我只想要一个新闻表

      

    新闻
          id |标题|描述|日期|含量

  2. 接下来我会有一个UserStatus表

      

    UserStatus
          id |用户ID |状态文本


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

    在用户创建句子后,您可以获取相关内容新闻和状态,并将形成的消息直接存储在表中,因此您将拥有一个针对读取进行了优化的消息表:

    Message
    id | message | User id | DateTime
    

    缺点是您可以按状态或新闻ID进行过滤,也可以在新闻或状态发生变化时更新消息。

    如果我们假设您允许用户更改新闻或状态,或者您希望按新闻ID或状态ID过滤消息,则可以选择

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

    News-Message-Mapper
    News Id | Message Id | Fragment Sequence
    



    Status-Message-Mapper
    Status Id | Message Id | Fragment Sequence
    


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

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

    这会优化读取,但更新很复杂,但会保留参照完整性和规范化规则。另外,您可以按新闻ID或状态ID

    过滤消息