我在为PostgreSQL项目创建架构时遇到了问题。
这是一个社交网站,如果有个人资料,每个个人资料分为三个类别:通用,教育和就业资料,因此每个资料需要不同的属性......我们如何在一个表中完成所有这些?
create type ProfileTypeValue as enum
('generic', 'education', 'employment');
create Profiles (
id integer
type ProfileTypeValue
....?
primary key (id)
);
因为例如,如果它是教育档案,那么我们需要有机构名称等,或者如果它是就业档案,那么我们需要有雇主姓名属性等。
最好只有3个不同的表,每个配置文件类型1,不知道这是否可能......但我觉得我需要一个if语句,说明它的配置文件,包含这些属性,或者它是否有个人资料,包括这些属性等。
答案 0 :(得分:3)
这里有几个选项
全部在同一张表中
在此选项中,无论配置文件是什么类型,所有字段都始终存在。第一次这很容易做,因为你只需要列出所有列。然而,这是一个非常糟糕的设计,从长远来看会使你的生活更加艰难,因为可维护性和可扩展性很差。您应该阅读数据库普通表格等。不要这样做。
在自己的表格中掌握配置文件表和配置文件类型相关的详细信息
在此选项中,您将为所有配置文件创建一个表。这将包括所有常见属性。此表将确保标识符全部位于相同的命名空间中,并且每个配置文件都具有唯一的ID。对于每种配置文件类型,您将创建一个新表,该表具有对主配置文件表的外键引用。然后,您可以使用就业资料表和主资料表上的内部联接选择所有就业情况。此设计允许您为每种配置文件类型创建约束。此外,这种设计使您可以获得有关就业和教育概况的概况。你应该这样做。
<强>继承强>
Postges为表继承提供了便利。您可以通过为所有配置文件类型创建基表,然后为每个配置文件类型创建子表来使用它。然后,每个配置文件类型都继承父表中定义的所有属性。通过继承,您可以使用父表选择所有配置文件,并使用就业配置文件表选择所有就业配置文件。如果通用配置文件仅使用公共属性,则可以将它们存储到父表。
postgres中继承的主要缺点是父表和子表不共享相同的命名空间。您无法创建跨越所有表的唯一约束。这意味着您必须确保标识符以其他方式全局唯一,例如为配置文件标识符保留一个单独的表。
您应该考虑继承的缺点在您的情况下是否重要。但是,如果您使用的是postgres,则这是为所有配置文件类型执行单独表的合理方法,因为您不必复制公共属性的定义。
键值存储
您还可以为常用配置文件属性创建表,并将其余的属性保留在(配置文件,属性,值) - 元组中。通过这样做,您将放弃RDBMS的好处,并且必须实现程序中的所有逻辑。不要这样做。
答案 1 :(得分:1)
PostgreSQL支持表级继承。您可以将Profile表作为具有公共属性的父表,然后将教育和就业的子表分开,只使用特定于这些类别的属性
查看PostgreSQL文档here。