sql - 何时为两种略有不同的信息使用单独的 SQL 数据库表?

标签 sql database database-design

<分区>

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

我正在尝试制作一个短篇小说网站,用户可以在其中编写自己的故事并可以浏览彼此的故事等。我还收集了过去伟大作家所写的经典短篇小说集。我很困惑是否应该将这两种类型的故事存储在同一个数据库表中。

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

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

请注意,还有其他表,例如故事的标签,链接到短篇小说表。

所以我基本上是在问你们 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.

然后如果你愿意,你可以围绕它们构建两个 View :

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

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

关于sql - 何时为两种略有不同的信息使用单独的 SQL 数据库表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503402/

相关文章:

mysql - 用于填充网页的大量静态数据 - 存储在数据库中,还是静态的?

使用 UML 类图进行数据库设计

sql - 从 "YYYY-MM"varchar 自动转换到 PostgreSQL 中的日期

sql - BigQuery 查询嵌套的 json

mysql - 数据上报、可视化和入库

asp.net-mvc - 将 1 个数据库用于帐户信息和内容是否正确

php - 如何定义用于查找数据库表的 ActiveRecord,以便它与枚举常量一样有用?

mysql - 从多个表中选择数据并在mysql中分组

sql - 为什么这个 MySQL Create Table 语句会失败?

mysql - 如何从一个表中返回一行,其中包含 MySQL 中第二个表中匹配 ID 的数量?