我正在制作一个新闻网站,但我想让用户从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
但元素中的某些字段将为空,我认为这不是一个好选择。
提前致谢:)
答案 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)
我认为如果您希望读取操作非常快(我假设它会假设它是一个新闻站点),可能以下设计会很好:
整体桌面设计:
我没有理由将新闻内容和新闻标题分开?所以我假设它是一对一的映射(即使不是这种情况,解决方案也不会改变很多)。所以我只想要一个新闻表
新闻
id |标题|描述|日期|含量
接下来我会有一个UserStatus表
UserStatus
id |用户ID |状态文本
当用户想要创建新闻消息时,例如您指出的消息[“某些用户插入文本状态某些其他文本某些其他状态另一个文本另一个状态”],他/她可以简单地选择新闻和/或句子的每个片段的状态。
在用户创建句子后,您可以获取相关内容新闻和状态,并将形成的消息直接存储在表中,因此您将拥有一个针对读取进行了优化的消息表:
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