什么更好?多个表具有相同的实体而几个关系表具有更多记录

时间:2016-07-14 07:47:18

标签: php mysql rdbms relational

我正在为一个小应用程序在mysql上创建一个数据库。 问题是在

等不同的表上有太多相同的字段

表1:市政问题: ID, 用户身份, 标题, 地点, 描述, IMAGEURL,

表2:Harrasement问题: ID , 用户身份, 标题, 地点, 描述, IMAGEURL

表3与上述相同

两张桌子都有相同的图案。 我想询问是否最好使用关系并创建一个表来处理ID并将其与其他详细信息链接起来,或者最好创建一个表格,为这些问题添加额外的库存。

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

对于表现更多行或更多表格的最佳选择。

我正在使用Mysql。

1 个答案:

答案 0 :(得分:1)

首先,除非您预计数百万条记录不关心性能,但更关心数据结构以及访问数据的容易程度。直接写下您计划在应用中提取的数据列表,例如“今天找到所有问题”,“查找超过6个月的所有未解决的问题”,然后尝试在您的预期结构上构建真正的SQL查询。如果他们努力了就试着改变结构。

回答你的问题:取决于。目前的结构有以下好处:

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

以及以下缺点:

  • 这是不灵活的。添加您忘记在开头添加的新字段将非常痛苦,因为您必须更改3个(或更多)表,然后在应用中更改相同数量的部分。
  • 添加新类型的问题将非常痛苦,需要创建新表。
  • 创建用于获取“所有未解决的问题(无论类型)”等数据的SQL-s将需要复杂的UNION - s。此外,这个UNIONS将需要创建具有问题类型的虚拟字段,否则您无法判断某个ID是从哪个表中来的。

经典数据库方法建议将一个表用于公共字段,并为不同字段创建派生表。所以:

  • issues表应包含所有公共字段,并由PK issue_id
  • 标识
  • municipal_issues使用外键issues.issue_id并且只有特定字段
  • harassment_issues使用外键issues.issue_id并且只有特定字段
  • issues表还有issue_type字段,其中包含“骚扰”,“市政”等值,并帮助查找存储其他数据的表格。

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

另外作为旁注,你可以查看像Mantis这样的bug跟踪器的db模式,因为它看起来像是同一个域。