【问题标题】:Creating an SQL Schema (postgresql)创建 SQL 模式 (postgresql)
【发布时间】:2011-03-27 06:05:30
【问题描述】:

我在为 PostgreSQL 项目创建架构时遇到问题。

这是针对社交网站的,如果有个人资料,并且每个个人资料都分为三种:通用、教育和就业个人资料,因此每个个人资料都需要不同的属性……我们如何在一张表中完成所有这些?

create type ProfileTypeValue as enum
   ('generic', 'education', 'employment');

create Profiles (
  id    integer
  type  ProfileTypeValue
  ....?
  primary key (id)
);

因为例如,如果它是一个教育档案,那么我们需要有机构名称等,或者如果它是一个就业档案,那么我们需要有一个雇主名称属性等。

最好只有 3 个不同的表,每个配置文件类型 1 个,不知道这是否可能……但我觉得我需要一个 if 语句来说明它是否是配置文件,包括这些属性,或者它是否是配置文件,包括这些属性等。

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

    这里有几个选项

    1. 全部在同一张表中
    2. 一个表中的通用配置文件属性,其自己的表中特定的配置文件类型,以及对通用配置文件表的外键引用
    3. 继承
    4. 键值存储

    都在同一张表中

    在此选项中,无论配置文件是什么类型,所有字段始终存在。第一次这样做太容易了,因为您只需要列出所有列。然而,从长远来看,这是一个非常糟糕的设计,会让你的生活更加艰难,因为可维护性和可扩展性很差。您应该阅读数据库范式等。不要这样做。

    主配置文件表和配置文件类型相关详细信息在他们自己的表中

    在此选项中,您将为所有配置文件创建一个表格。这将包括所有常见的属性。该表将确保标识符都在同一个命名空间中,并且每个配置文件都有一个唯一的 id。对于每种配置文件类型,您将创建一个新表,其中包含对主配置文件表的外键引用。然后,您可以使用就业概况表和主概况表上的内部联接来选择所有就业概况。此设计允许您为每种配置文件类型创建约束。此外,这种设计让您拥有既是就业档案又是教育档案的档案。你可能应该这样做。

    继承

    Postges 为表继承提供了便利。您可以通过为所有配置文件类型创建一个基表,然后为每个配置文件类型创建子表来使用它。然后,每个配置文件类型都会继承父表中定义的所有属性。通过继承,您可以使用父表选择所有配置文件,并使用就业概况表选择所有就业概况。如果通用配置文件仅使用通用属性,则可以将它们存储到父表中。

    postgres 中继承的主要缺点是父表和子表不共享同一个命名空间。您不能创建跨越所有表的唯一约束。这意味着您必须以其他方式确保标识符是全局唯一的,例如为配置文件标识符保留一个单独的表。

    您应该考虑继承的缺点是否对您的情况很重要。但是,如果您使用 postgres,这是为所有配置文件类型创建单独表的明智方法,因为您不必复制公共属性的定义。

    键值存储

    您还可以为常见的配置文件属性创建一个表,并将其余属性保存在(配置文件、属性、值)元组中。通过这样做,您将放弃 RDBMS 的好处,并且您必须在您的程序中实现所有逻辑。不要这样做。

    【讨论】:

    • +1,非常好的答案。就我个人而言,我会选择选项 2。选项 3 可以在 Postgres 中使用 hstore 数据类型来完成,这种数据类型非常有效,也可以被索引。
    • 评论中的错字:hstore 用于选项 4(键值存储):postgresql.org/docs/9.0/static/hstore.html
    【解决方案2】:

    PostgreSQL 支持表级继承。您可以将 Profile 表作为具有公共属性的父表,然后将教育和就业的子表分开,仅具有特定于这些类别的属性

    查看 PostgreSQL 文档here

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 2015-08-15
      • 2013-11-05
      • 1970-01-01
      • 2020-04-26
      • 2022-01-22
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多