我正在 mysql 上为一个小型应用程序创建一个数据库。 问题是不同表上有太多相同的字段,例如
表 1:市政问题: ID, 用户身份, 标题, 地点, 描述, 图片网址,
表 2:骚扰问题: ID , 用户身份, 标题, 地点, 描述, 图片网址
表3同上
两个表的列几乎相同。 我想问是否最好使用关系并创建一个表来处理 ID 并将其与其他详细信息链接起来,或者最好创建一个具有针对这些问题的额外功能的单个表。
一方面,会有太多具有相同列的表。 另一方面,很少有表中的行数过多。
更多行或更多表对性能最有利。
我正在使用Mysql。
最佳答案
首先,除非您期望有数百万条记录,否则不太关心性能,而是更关心数据的结构以及访问数据的难易程度。从字面上写下您计划在应用程序中提取的数据列表,例如“查找今天的所有问题”、“查找所有 6 个月以上 Unresolved 问题”,然后尝试根据您的预期结构构建真正的 SQL 查询。如果他们努力改变结构。
回答您的问题:这取决于。当前的结构具有以下优点:
- 可以轻松查询某些类型的问题
- 构建 PHP 应用程序很容易 - 只需制作一个模板表单(或模型),然后复制粘贴它并对其他表稍加更改
- 如果出现性能问题,只需将每个表放在不同的数据库服务器上即可更轻松地创建集群。
以及以下缺点:
- 它不灵活。添加您在开始时忘记添加的新字段将会很痛苦,因为您必须更改 3 个(或更多)表,然后在应用程序中更改相同数量的部分。
- 添加新类型的问题会很麻烦,并且需要创建新表。
- 创建 SQL-s 来获取诸如“所有 Unresolved 问题(无论类型)”之类的数据将需要复杂的
UNION
-s。此外,这个UNIONS
将需要创建具有问题类型的虚拟字段,否则您无法判断某个ID来自哪个表。
经典的数据库方法建议对公共(public)字段使用一张表,并为不同的字段创建派生表。所以:
issues
表应包含所有公共(public)字段,并由 PKissue_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/