何时对两种稍有不同的信息类型使用单独的SQL数据库表?

何时对两种稍有不同的信息类型使用单独的SQL数据库表?,sql,database,database-design,Sql,Database,Database Design,我需要一个让我困惑了一段时间的SQL决策的帮助 我正在尝试建立一个短篇故事网站,用户可以写自己的故事,也可以浏览彼此的故事,等等。我还收集了过去伟大作家写的经典短篇故事集。我不知道是否应该将这两种类型的故事存储在同一个数据库表中 我想让这两种类型的故事(经典作者/用户)在某种程度上保持不同,因为你应该能够搜索网站并从结果中过滤出用户故事。但我不能只在表中有一个数据库行来表示这一点,即布尔经典,因为对于经典短存储,其他几行也会不同-没有用户,用户提交时的日期将是YYYY(即1869),而不是完整的

我需要一个让我困惑了一段时间的SQL决策的帮助

我正在尝试建立一个短篇故事网站,用户可以写自己的故事,也可以浏览彼此的故事,等等。我还收集了过去伟大作家写的经典短篇故事集。我不知道是否应该将这两种类型的故事存储在同一个数据库表中

我想让这两种类型的故事(经典作者/用户)在某种程度上保持不同,因为你应该能够搜索网站并从结果中过滤出用户故事。但我不能只在表中有一个数据库行来表示这一点,即布尔经典,因为对于经典短存储,其他几行也会不同-没有用户,用户提交时的日期将是YYYY(即1869),而不是完整的日期时间

然而,我也不能完全证明将它们放在单独的表格中是合理的。当大多数属性都相同时,我真的应该为短篇小说使用两个不同的数据库表吗?目前,我在经典短篇小说的用户行中填写NULL,我的过滤搜索有一个选项,可以只通过经典小说进行搜索,它从用户为NULL的数据库中进行选择。当你在一个巨大的数据库中搜索数以百万计的用户故事,只为了找到几千个经典故事时,这似乎会影响性能

请注意,也有其他表链接到short stories表,如用于故事的标记

因此,我基本上是在问SQL专家,是否有足够的理由将这两种类型的信息划分到不同的表中?我目前正在开发中使用SQLite,但稍后将切换到MySQL或PostgreSQL。

我可能会使用“父子”表结构,在这种结构中,表之间有匹配的主键,例如:

Stories: StoryId (PK), StoryType (U or C), StoryText, etc. (all of the shared stuff)
UserStories: StoryId (PK and FK), UserId, etc.
ClassicStories: StoryId (PK and FK), AuthorName, etc.
然后,如果需要,可以围绕它们构建两个视图:

V_UserStories: StoryId, StoryText, UserId, etc.
V_ClassicStories: StoryId, StoryText, AuthorName, etc.

通过这种设置,您不必浪费任何列,您可以将共享内容放在一起,同时如果需要,还可以轻松地将两种类型的故事在逻辑上分开。

要做出这样的决定,您必须考虑是否只为表插入字段,而不为其他内容插入。 比如说


故事和故事类型,如果一个故事可以有几种类型的故事和/或几种类型的故事,那么是的,您必须制作一个特定的历史表格,但是如果只有一种类型的故事涉及一个故事,那么您可以插入类型信息(名称、描述等)直接进入故事表。

在这种情况下,技术上不需要
StoryType
列-如果您对UserStories进行内部连接并获得一条记录,那么它就是一个用户故事,如果您对ClassicStories进行内部连接并获得一条记录,那么它就是一个经典故事。故事类型栏只是为了方便起见才出现的。+1!现在很高兴听到人们推荐这样的设计方法!此外,您还可以将
标签
表与
故事
关联,以实现通用功能,同时出于明显的原因,使
共享
表仅指向
用户故事
。我可以添加更多,但我刚才已经写了。谢谢大家,我会选择这个设计。Mosty Mostacho似乎是回答这类问题的专家,所有这些答案让我更清楚地了解了整个问题。一个用于通用函数的表是最好的。简言之,您有一个层次结构,您需要了解如何将其转换为物理模型。也许会有帮助,也许会。