【问题标题】:News database design新闻数据库设计
【发布时间】:2012-12-14 15:33:50
【问题描述】:

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

这是新闻内容的示例

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

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

我想出了五张桌子。

表格NewsHeader

id  
NewsTitle  
NewsDesc  
NewsDate
User

表格 NewsContent - 仅包含 id 和消息的状态或消息文本

id  
content

表格NewsContentDetails - 包含状态的详细信息

id
ContentUser
ContentDate

Table NewsContentDetailsLink - NewsContentNewsContentDetails

的连接表
NewsContentId  
NewsContentDetailsId

Table NewsHeaderContent - NewsHeaderNewsContent

的连接表
NewsHeaderId  
NewsContentId

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

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

**News:**

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

**Elements:**

ID |内容 |用户 |日期 |新闻_ID

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

提前致谢:)

【问题讨论】:

  • 老实说,我看到的最大问题是名称似乎很笼统。我什至无法理解您是如何尝试建模的。名称应该是描述性的,而这些不是。我更喜欢[NewsArticleHeader][NewsArticleContent] 等。我也更喜欢用他们的名字来松散地组织表格。从 [NewsArticleHeader][NewsArticleContent] 相关的名称就可以明显看出这一点。简洁的对象名称可以节省编码时的输入时间,但会因为混淆阅读代码或使用 DB 模式的人而浪费时间。打字很容易。理解是困难的。
  • 我编辑了我的问题。我希望现在好些了。
  • 是什么让状态变得特别并与全文不同?为什么不合并下来,而你只有一个 nvarchar(max) 字段?
  • 其他一些值与状态一起插入 - 例如日期、写入状态的用户、用户的图片等。
  • 新闻的内容或状态在被用于创建一个表单语句(news status news status...)后会发生变化还是保持不变,用户无法更改?

标签: sql database database-design data-modeling


【解决方案1】:

你不需要 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

新闻内容

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

【讨论】:

  • 状态上的 ContentDate 必须是状态的日期。 ContentUser 是状态的用户,所以这两个将为空,除非我插入状态信息。
  • 如果是这种情况,您可以允许 ContentUser 和 ContentDate 为空,我将编辑我的 anwser 以反映这一点,并改进 NewsContent 以允许未来更改。
  • 我对这些空白字段表示怀疑,因为它们会很多。这是否违反规范化规则?
  • @lam3r4370 这是否违反规范化规则?我不知道,NULL 值是没有数据,这正是这里的情况。
  • 为什么是 ContentId 表,Sequence 表是必需的吗?
【解决方案2】:

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

新闻:

ID | Title | Content | User | Date

元素:

ID | Content | User | Date | News_ID

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

【讨论】:

  • 但是用户可以在新闻中任何他想要的地方插入状态,我想在他插入时显示它。
  • 你能再解释一下吗?我不确定我是否理解。
  • 这是一条新闻的内容“一些用户插入文本状态一些其他文本一些其他状态另一个文本另一个状态”。所以我无法弄清楚如何使用您的数据库设计保存文本序列
【解决方案3】:

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


整体餐桌设计:

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

    新闻
    编号 |标题 |描述 |日期 |内容

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

    用户状态
    编号 |用户 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 过滤消息

【讨论】:

  • 好的,但是如果用户重新排序状态的位置呢?
  • 那么您需要更改 News-Message 映射器和 Status-message 映射器中的 Fragment 序列,或者最好只删除两个表中的旧映射并根据重新排序的消息添加新闻条目。
  • 是的,这是正确的。所以这将使读取变得非常简单和快速,您不必执行任何连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多