Postgresql 有两个或多个具有相同列的表是一种好的做法吗?

Postgresql 有两个或多个具有相同列的表是一种好的做法吗?,postgresql,database-design,Postgresql,Database Design,我正在创建一个允许用户搜索餐厅和咖啡馆的web应用程序。因为我目前除了它们的类型之外没有其他数据来区分这两种类型,所以我有两种方法来存储餐馆列表 为餐馆和咖啡馆使用一个表,并有一个enum(文本)列,说明条目是餐馆还是咖啡馆 创建两个单独的桌子,一个用于餐馆,一个用于咖啡馆 我永远不需要执行一个从两者收集数据的查询,所以我想对我来说唯一重要的是性能。您认为PostgreSQL的更好选项是什么?典型的数据库建模将适用于单个表。主要原因是可维护性。如果您有两个具有相同列的表,并且您的客户机决定它们要

我正在创建一个允许用户搜索餐厅和咖啡馆的web应用程序。因为我目前除了它们的类型之外没有其他数据来区分这两种类型,所以我有两种方法来存储餐馆列表

  • 为餐馆和咖啡馆使用一个表,并有一个enum(文本)列,说明条目是餐馆还是咖啡馆
  • 创建两个单独的桌子,一个用于餐馆,一个用于咖啡馆

  • 我永远不需要执行一个从两者收集数据的查询,所以我想对我来说唯一重要的是性能。您认为PostgreSQL的更好选项是什么?

    典型的数据库建模将适用于单个表。主要原因是可维护性。如果您有两个具有相同列的表,并且您的客户机决定它们要添加一列,例如操作小时数。您现在必须编写两组代码来创建列、读取新列、更新新列等。此外,如果您的客户希望您开始跟踪条,那么现在您需要第三个表和第三组代码。很快就会变得一团糟。最好有两个表,一个是数据表(比如设施),其中包含大多数列(名称、位置等),然后是第二个表,它是“类型”表(比如设施类型),其中包含餐厅、咖啡馆、酒吧等的行,当然还有一个外键链接这两个表。这样,您就可以拥有“X”类型,并且只需要维护一组代码

    当然,此规则也有例外,您可能需要单独的表:

  • 巨大的数据集带来的性能。(这取决于你的服务器,但在它在Postgres中起作用之前,我们至少讨论了数十万行)。如果这是我建议在提高性能的同时保持适当的可维护性的原因
  • 咖啡馆和餐馆在你的网站上有两套完全不同的功能。如果你的整个代码都在说如果咖啡馆,做这个,如果餐馆,做那个,那么你已经有两套代码要维护了,代码中增加了
    If
    逻辑的麻烦。如果是这样的话,两个单独的表是一个更干净、更符合逻辑的选择

  • 典型的数据库建模将适用于单个表。主要原因是可维护性。如果您有两个具有相同列的表,并且您的客户机决定它们要添加一列,例如操作小时数。您现在必须编写两组代码来创建列、读取新列、更新新列等。此外,如果您的客户希望您开始跟踪条,那么现在您需要第三个表和第三组代码。很快就会变得一团糟。最好有两个表,一个是数据表(比如设施),其中包含大多数列(名称、位置等),然后是第二个表,它是“类型”表(比如设施类型),其中包含餐厅、咖啡馆、酒吧等的行,当然还有一个外键链接这两个表。这样,您就可以拥有“X”类型,并且只需要维护一组代码

    当然,此规则也有例外,您可能需要单独的表:

  • 巨大的数据集带来的性能。(这取决于你的服务器,但在它在Postgres中起作用之前,我们至少讨论了数十万行)。如果这是我建议在提高性能的同时保持适当的可维护性的原因
  • 咖啡馆和餐馆在你的网站上有两套完全不同的功能。如果你的整个代码都在说如果咖啡馆,做这个,如果餐馆,做那个,那么你已经有两套代码要维护了,代码中增加了
    If
    逻辑的麻烦。如果是这样的话,两个单独的表是一个更干净、更符合逻辑的选择

  • 最后,我选择使用两个单独的表,因为我真的不需要同时搜索这两个表,这样,如果我需要添加另一个特定于咖啡馆的数据字段,例如,我可以在将来扩展一个表。

    最后,我选择使用两个单独的表,因为我真的不需要同时搜索这两个字段,这样,如果我需要添加另一个特定于咖啡馆的数据字段,我可以在将来扩展一个表。

    在您的情况下,选项2会快一点(特别是随着时间的推移)。。。在您的代码中,您将决定动态地从哪个表中提取。选项2是个坏主意。使用选项1。这是一个适当规范化的模型,将来问题会少很多。“我永远不需要执行一个从两者收集数据的查询”——这很难相信。如果用户希望同时搜索这两个选项,该怎么办?在您的情况下,选项#2会快一点(特别是随着时间的推移)。。。在您的代码中,您将决定动态地从哪个表中提取。选项2是个坏主意。使用选项1。这是一个适当规范化的模型,将来问题会少很多。“我永远不需要执行一个从两者收集数据的查询”——这很难相信。如果一个用户想同时搜索这两个行呢?现在,数十万行被认为是不多的。即使代码中有两组功能,出于您陈述的原因,单个表也是最好的。如果需要两个数据源,可以添加咖啡厅视图和餐厅视图。触发器甚至可以允许DML通过视图。无需牺牲可维护性或数据完整性。如今,“数十万”行并不算庞大。即使代码中有两组功能,出于您陈述的原因,单个表也是最好的。如果需要两个数据源,可以添加咖啡厅视图和餐厅视图。触发器甚至可以允许DML通过视图。无需牺牲可维护性或数据完整性。