什么更好?具有相同实体的多个表与具有更多记录的少数关系表

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 等错误跟踪器的数据库架构,因为这看起来像是同一个域。