2011-03-27 37 views
0

我在为PostgreSQL项目创建模式时遇到问题。创建SQL模式(postgresql)

这是一个社交网站,如果有个人资料,每个个人资料都有三种类型:通用,教育和就业情况,因此每个个人资料都需要不同的属性......我们如何在一个表中完成所有操作?

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

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

,因为例如,如果它是一个教育资料,然后我们需要有机构名称等,或者如果它是一个就业的个人资料,那么我们就需要有雇主的名字属性等

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

回答

3

这里有几个选项

  1. 都在同一个表中的一个表,具体的使用对普通的个人资料表
  2. 继承
  3. key-value存储
外键引用自己的表配置文件类型
  • 常用配置属性

    都在同一个表

    在此选项中的所有领域都始终存在任何类型的配置文件。由于您只需列出所有列,因此这很容易首次执行。然而,这是一个非常糟糕的设计,从长远来看,这会让你的生活更加艰难,因为可维护性和可扩展性很差。你应该阅读数据库正常表单等。不要这样做。

    主的个人资料表和配置文件类型在他们自己的表

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

    继承

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

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

    你应该考虑继承的缺点在你的情况下是否重要。但是,如果您使用的是postgres,则这是为所有配置文件类型执行单独表的明智方式,因为您不必复制常用属性的定义。

    key-value存储

    你也可以创建普通的个人资料属性表,​​并保持attribues的其余部分(配置文件,属性值)元组。通过这样做,你会放弃RDBMS的好处,并且你必须在你的程序中实现所有的逻辑。不要这样做。

  • +2

    +1,非常好的答案。就个人而言,我会选择2.选项3可以在Postgres中使用'hstore'数据类型来完成,这种数据类型非常高效,并且可以被索引。 – 2011-03-27 09:08:28

    +0

    评论中的错字:hstore用于选项4(键值存储):http://www.postgresql.org/docs/9.0/static/hstore.html。 – 2011-03-27 09:18:44

    +0

    @Aleski:你说得对。谢谢 – 2011-03-27 09:35:31

    1

    PostgreSQL支持表级继承。您可以创建一个配置文件表作为具有公共属性的父表,然后将其分配给仅用于教育和就业的子表(仅限于这些类别的属性)

    查看PostgreSQL文档here