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

标签 php mysql rdbms relational

我正在 mysql 上为一个小型应用程序创建一个数据库。 问题是不同表上有太多相同的字段,例如

表 1:市政问题: ID, 用户身份, 标题, 地点, 描述, 图片网址,

表 2:骚扰问题: ID , 用户身份, 标题, 地点, 描述, 图片网址

表3同上

两个表的列几乎相同。 我想问是否最好使用关系并创建一个表来处理 ID 并将其与其他详细信息链接起来,或者最好创建一个具有针对这些问题的额外功能的单个表。

一方面,会有太多具有相同列的表。 另一方面,很少有表中的行数过多。

更多行或更多表对性能最有利。

我正在使用Mysql。

最佳答案

首先,除非您期望有数百万条记录,否则不太关心性能,而是更关心数据的结构以及访问数据的难易程度。从字面上写下您计划在应用程序中提取的数据列表,例如“查找今天的所有问题”、“查找所有 6 个月以上 Unresolved 问题”,然后尝试根据您的预期结构构建真正的 SQL 查询。如果他们努力改变结构。

回答您的问题:这取决于。当前的结构具有以下优点:

  • 可以轻松查询某些类型的问题
  • 构建 PHP 应用程序很容易 - 只需制作一个模板表单(或模型),然后复制粘贴它并对其他表稍加更改
  • 如果出现性能问题,只需将每个表放在不同的数据库服务器上即可更轻松地创建集群。

以及以下缺点:

  • 它不灵活。添加您在开始时忘记添加的新字段将会很痛苦,因为您必须更改 3 个(或更多)表,然后在应用程序中更改相同数量的部分。
  • 添加新类型的问题会很麻烦,并且需要创建新表。
  • 创建 SQL-s 来获取诸如“所有 Unresolved 问题(无论类型)”之类的数据将需要复杂的 UNION-s。此外,这个UNIONS将需要创建具有问题类型的虚拟字段,否则您无法判断某个ID来自哪个表。

经典的数据库方法建议对公共(public)字段使用一张表,并为不同的字段创建派生表。所以:

  • issues 表应包含所有公共(public)字段,并由 PK issue_id 标识
  • municipal_issues 使用 issues.issue_id 的外键,并且仅包含特定字段
  • harassment_issues 使用 issues.issue_id 的外键并且仅包含特定字段
  • issues 表还具有 issue_type 字段,该字段采用“骚扰”、“市政”等值,有助于查找存储附加数据的表。<

此模式称为“Class Table inheritance ”,您可以查看 SQL antipatterns演示以获取更多信息和其他方法。这解决了灵 active 问题,并且仍然允许仅使用一个简单的 JOIN 来重新创建每个原始表,而且速度相当快。

另外,作为旁注,您可以查看错误跟踪器的数据库模式,例如 Mantis因为这看起来像同一个域。

关于php - 什么更好?具有相同实体的多个表与具有更多记录的少数关系表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368402/

相关文章:

rdbms - 如何找到 "nearby"结果?

php - Symfony 访问 web 目录之外的 mp3 文件以在浏览器中播放

PHP;使用 session 还是重新使用查询?

php - 如何使 "test"MySQL 服务器完整?

PHP Location Header 忽略哈希

mysql - 无法使用 bulkCreate 进行 50k 插入

php - 插入数据并以 json 形式返回

java - 记录java应用程序的cpu使用情况

php - 通过 MySQL 模式还是 PHP 检查输入数据?

rdbms - infobright 中的最大列数