【问题标题】:One MySQL Table for all resources VS multiple tables for each resource所有资源的一个 MySQL 表 VS 每个资源的多个表
【发布时间】:2013-04-02 21:16:22
【问题描述】:

我正在开发一个网络应用程序,用户可以在其中创建以下资源/内容:

Events | Music | Posts | Classifieds

它们有很多共同的领域,例如:

created_date | title | desc | user_id

现在我想知道是否应该为每个内容创建单独的表,或者将它们全部保存在一个表中,并使用指向 content_type 表的 type_id 外键。当然,会有一些不同的字段,它们只会被特定的内容类型使用,对于那些不使用这些字段的人,我可以将其留空。

数据看起来更有条理,每种内容类型都有单独的表格,但在所有表格中搜索关键字正在成为一场噩梦(使用连接、联合等)。如果只是一个表,搜索会很容易。

我需要用户能够使用关键字搜索所有内容。他还可以搜索特定内容,为此我将在type_id 字段上添加WHERE 子句。

我不了解每种方法的所有优点/缺点,但如果有人能给我建议,我将不胜感激,这样我就不会做出错误的决定,并且必须从头开始重做所有事情。

【问题讨论】:

  • 一切都取决于您将如何使用数据。
  • @nathanhayfield 我只是无法组合来自不同表格的搜索结果。如果我只是对搜索结果进行简单的数组合并,那么最终结果将不会处于正确的排名中。它们将根据应用程序首先搜索内容的顺序进行排序。我需要所有内容中最相关的结果。
  • 在我看来,它们应该在一个具有相关 content_type 表的表中,但如果不知道完整架构,就很难确定。
  • 应用程序越强大,它就越复杂。如果您不确定如何管理复杂性,那么就使用更简单的模式。一旦你觉得你掌握了窍门,你就可以准备好迎接一个更复杂的系统了。无论如何,如果没有对架构的精确描述,我们将无法帮助您解决复杂的查询。

标签: php mysql sql database database-design


【解决方案1】:

也许可以考虑使用“具有”关系。例如,一个事件“有一个”“web 项目句柄”附加到它,而“web 项目句柄”是一个带有描述、创建日期、标题、“所有者”等的事物......

【讨论】:

    【解决方案2】:

    除非它们确实具有相同的数据,否则我会使用单独的表。拥有一个表,其中的某些字段仅由特定内容类型使用,这确实不是很好的数据库设计。

    如果你真的想要一个包含基本数据的表,你可以按照你的建议创建一个包含 content_type 和公共字段的表,然后为每个类型创建 4 个单独的表和其他不同的字段,然后做一个内部当您选择该类型的字段时加入。但我个人认为你最好只创建 4 个表。

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 2021-05-31
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多