什么更好?具有相同实体的多个表与具有更多记录的少数关系表
What's Better? Multiple Tables having same Entities vs Few Relation Tables having more Records
我正在 mysql 上为一个小应用程序创建一个数据库。
问题是在不同的 Table 上有太多相同的字段,例如
Table 1:市政问题:
ID,
用户身份,
标题,
地点,
描述,
图片网址,
Table 2:骚扰问题:
ID ,
用户身份,
标题,
地点,
描述,
图片网址
Tables 3 同上
两个table的库几乎相同。
我想问一下,使用关系并创建一个 table 来处理 ID 和 link 它与其他细节是否更好,或者最好创建一个带有额外的 table 用于这些问题。
一方面,会有太多 table 具有相同的列。
另一方面,很少有 table 行太多。
更多行或更多 tables.
什么对性能最好
我正在使用 Mysql。
首先,除非您期望数百万条记录不太关心性能,而是更关心数据的结构以及访问数据的难易程度。从字面上写下您计划在应用程序中提取的数据列表,例如"find all issues today"、"find all unresolved issues older than 6 months" 然后尝试在您预期的结构上构建真正的 SQL 查询。如果他们努力尝试改变结构。
回答你的问题:这取决于。当前结构具有以下优点:
- 查询某类问题很简单
- 构建 PHP 应用程序很容易 - 只需制作一个模板表单(或模型),然后将其复制粘贴并稍作更改即可用于其他 tables
- 如果出现性能问题,只需将每个 table 放在不同的数据库服务器上,创建集群可能会更容易。
以及以下缺点:
- 这是不灵活的。添加您在开始时忘记添加的新字段会很痛苦,因为您必须更改 3(或更多)tables,然后在您的应用程序中更改相同数量的部分。
- 添加新类型的问题会很痛苦,需要创建新的 table。
- 创建 SQL-s 以获取像 "all non-resolved issues (regardless of type)" 这样的数据将需要复杂的
UNION
-s。此外,此 UNIONS
将需要创建具有问题类型的虚拟字段,否则您无法判断某些 ID 来自哪个 table。
经典数据库方法建议对公共字段使用一个 table,并为不同的字段创建派生的 table。所以:
issues
table 应具有所有公共字段并由 PK issue_id
标识
municipal_issues
使用 issues.issue_id
的外键并且只有特定字段
harassment_issues
使用外键 issues.issue_id
并且只有特定字段
-
issues
table 也有 issue_type
字段,该字段采用值 "harassment"、"municipal" 等,有助于找到 table 其中存储了额外的数据。
此模式称为“Class Table inheritance" and you may check out the SQL antipatterns 演示文稿以获取更多信息和其他方法。这解决了灵活性问题,并且仍然允许重新创建每个原始 tables,只需一个简单的 JOIN进行得相当快。
此外,作为旁注,您可以查看 Mantis 等错误跟踪器的数据库架构,因为这看起来像是同一个域。
我正在 mysql 上为一个小应用程序创建一个数据库。 问题是在不同的 Table 上有太多相同的字段,例如
Table 1:市政问题: ID, 用户身份, 标题, 地点, 描述, 图片网址,
Table 2:骚扰问题: ID , 用户身份, 标题, 地点, 描述, 图片网址
Tables 3 同上
两个table的库几乎相同。 我想问一下,使用关系并创建一个 table 来处理 ID 和 link 它与其他细节是否更好,或者最好创建一个带有额外的 table 用于这些问题。
一方面,会有太多 table 具有相同的列。 另一方面,很少有 table 行太多。
更多行或更多 tables.
什么对性能最好我正在使用 Mysql。
首先,除非您期望数百万条记录不太关心性能,而是更关心数据的结构以及访问数据的难易程度。从字面上写下您计划在应用程序中提取的数据列表,例如"find all issues today"、"find all unresolved issues older than 6 months" 然后尝试在您预期的结构上构建真正的 SQL 查询。如果他们努力尝试改变结构。
回答你的问题:这取决于。当前结构具有以下优点:
- 查询某类问题很简单
- 构建 PHP 应用程序很容易 - 只需制作一个模板表单(或模型),然后将其复制粘贴并稍作更改即可用于其他 tables
- 如果出现性能问题,只需将每个 table 放在不同的数据库服务器上,创建集群可能会更容易。
以及以下缺点:
- 这是不灵活的。添加您在开始时忘记添加的新字段会很痛苦,因为您必须更改 3(或更多)tables,然后在您的应用程序中更改相同数量的部分。
- 添加新类型的问题会很痛苦,需要创建新的 table。
- 创建 SQL-s 以获取像 "all non-resolved issues (regardless of type)" 这样的数据将需要复杂的
UNION
-s。此外,此UNIONS
将需要创建具有问题类型的虚拟字段,否则您无法判断某些 ID 来自哪个 table。
经典数据库方法建议对公共字段使用一个 table,并为不同的字段创建派生的 table。所以:
issues
table 应具有所有公共字段并由 PKissue_id
标识
municipal_issues
使用issues.issue_id
的外键并且只有特定字段harassment_issues
使用外键issues.issue_id
并且只有特定字段-
issues
table 也有issue_type
字段,该字段采用值 "harassment"、"municipal" 等,有助于找到 table 其中存储了额外的数据。
此模式称为“Class Table inheritance" and you may check out the SQL antipatterns 演示文稿以获取更多信息和其他方法。这解决了灵活性问题,并且仍然允许重新创建每个原始 tables,只需一个简单的 JOIN进行得相当快。
此外,作为旁注,您可以查看 Mantis 等错误跟踪器的数据库架构,因为这看起来像是同一个域。