2

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

这是新闻内容的示例

“一些用户插入文本状态一些其他文本一些其他状态另一个文本另一个状态

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

我想出了五张桌子。

新闻标题

id  
NewsTitle  
NewsDesc  
NewsDate
User

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

id  
content

NewsContentDetails - 包含状态的详细信息

id
ContentUser
ContentDate

NewsContentDetailsLink - NewsContentNewsContentDetails的连接表

NewsContentId  
NewsContentDetailsId

NewsHeaderContent - NewsHeaderNewsContent的连接表

NewsHeaderId  
NewsContentId

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

编辑: @hrr 建议的数据库设计

**News:**

身份证 | 标题 | 内容 | 用户 | 日期

**Elements:**

身份证 | 内容 | 用户 | 日期 | 新闻_ID

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

提前致谢 :)

4

3 回答 3

2

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

新闻标题

id  
NewsTitle  
NewsDesc  
NewsDate

新闻内容

NewsId
ContentId  
Sequence
content
ContentUser
ContentDate

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

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

新闻标题

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

新闻内容

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

于 2012-12-07T14:06:00.547 回答
0

您可以将一张表格用于新闻,一张表格用于元素。

消息:

ID | Title | Content | User | Date

元素:

ID | Content | User | Date | News_ID

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

于 2012-11-30T21:46:49.713 回答
0

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


整体餐桌设计: 在此处输入图像描述

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

    新闻
    ID | 标题 | 描述 | 日期 | 内容

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

    用户状态
    ID | 用户 ID | 状态文本


当用户想要创建一条新闻消息时,例如您指出的消息 ["Some user insert text Status Some other text Some other status another text another Status" ],他/她可以简单地选择新闻和/或状态为句子的每个片段。

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

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 过滤消息

于 2012-12-13T19:21:33.463 回答