Orm 在postgresql中模拟继承的最佳方法?

Orm 在postgresql中模拟继承的最佳方法?,orm,Orm,对于我正在编写的应用程序,有两种类型的“用户”,即有账户的用户和没有账户的用户,virtual\u用户。这两种类型几乎相同,除了帐户用户有密码,而且电子邮件是必需的,并且在所有帐户用户中必须是唯一的,尽管它可以与虚拟用户的任何数字相同。许多表都有一列引用了用户,这两个表都应该包含,90%的应用程序功能将它们视为可互换的。最好的处理方法是什么?我考虑过的一些选择: -将这两种类型的用户放在同一个表中,并且在唯一性方面有一个复杂的约束,基本上,如果密码不为空,电子邮件在所有用户中必须是唯一的,其中密

对于我正在编写的应用程序,有两种类型的“用户”,即有账户的用户和没有账户的用户,
virtual\u用户
。这两种类型几乎相同,除了
帐户用户
密码
,而且
电子邮件
是必需的,并且在所有
帐户用户
中必须是唯一的,尽管它可以与
虚拟用户
的任何数字相同。许多表都有一列引用了
用户
,这两个表都应该包含,90%的应用程序功能将它们视为可互换的。最好的处理方法是什么?我考虑过的一些选择:

-将这两种类型的用户放在同一个表中,并且在唯一性方面有一个复杂的约束,基本上,如果
密码
不为空,
电子邮件
在所有
用户
中必须是唯一的,其中
密码
不为空。我不知道该如何编写此约束。在少数情况下,我只希望
帐户用户
只查询拥有
密码的
用户
。如果我能想出如何编写约束,这似乎是最好的解决方案

-拥有
帐户用户
虚拟用户
继承,并且
虚拟用户
有一个附加列
密码
和对
电子邮件
的唯一约束。这里有两种可能的选择:

---有一个
Users
表,其中包括两列
account\u user\u id
virtual\u user\u id
,其中一列为空,另一列对应于相应的用户。当其他表需要引用用户时,它们引用此表。让我的所有查询服务器端为用户查询两个表并合并

---当其他表需要引用时,它们引用任一表。我认为这是不可能的。让我的所有查询服务器端为用户查询两个表并合并


任何建议都将不胜感激。

我假设您有一个系统,其中某些部分要求用户登录到注册帐户,而其他部分则不要求,但您仍然希望跟踪用户

。你可以用这个,但我会担心这些警告

您可以将它们全部放在一个表中,并使用某种标志,如,但随后会遇到约束问题。然后在模型中强制约束。如果你有一个强大的模型,这应该是好的

您可以拥有独立的
帐户
用户
。与其说其中一个是另一个的特例,不如说它们的关键是将它们视为两个概念上不同的事物。在OO术语中,帐户用户

我喜欢这一点,因为不涉及任何标志,
users
accounts
可以有单独的约束,
accounts
表不会因为出现过一次就再也没有回来的用户而变得臃肿

您可以通过简单的连接访问完整的帐户信息

select accounts.*, users.token
from accounts
join users on accounts.user_id = users.id
where accounts.id = ?
如果要删除帐户,可以在不丢失基础用户信息的情况下删除

delete from accounts where accounts.id = ?
需要帐户的系统使用帐户。不使用用户的系统。对于用户和帐户行为不同的系统可以轻松检查用户是否拥有帐户

select accounts.id
from accounts
where accounts.user_id = ?

用户跟踪与
用户
表相关联,因此用户注册前后的行为记录是一致的。

我假设您有一个系统,其中某些部分要求用户登录到注册帐户,而其他部分则不要求,但您仍然希望跟踪用户

。你可以用这个,但我会担心这些警告

您可以将它们全部放在一个表中,并使用某种标志,如,但随后会遇到约束问题。然后在模型中强制约束。如果你有一个强大的模型,这应该是好的

您可以拥有独立的
帐户
用户
。与其说其中一个是另一个的特例,不如说它们的关键是将它们视为两个概念上不同的事物。在OO术语中,帐户用户

我喜欢这一点,因为不涉及任何标志,
users
accounts
可以有单独的约束,
accounts
表不会因为出现过一次就再也没有回来的用户而变得臃肿

您可以通过简单的连接访问完整的帐户信息

select accounts.*, users.token
from accounts
join users on accounts.user_id = users.id
where accounts.id = ?
如果要删除帐户,可以在不丢失基础用户信息的情况下删除

delete from accounts where accounts.id = ?
需要帐户的系统使用帐户。不使用用户的系统。对于用户和帐户行为不同的系统可以轻松检查用户是否拥有帐户

select accounts.id
from accounts
where accounts.user_id = ?

用户跟踪与
用户
表相关联,因此用户注册前后的行为记录是一致的。

谢谢!这是一个非常有用和全面的答案。这比我考虑的任何事情都要好,这会让我省去一大堆头疼的事。谢谢!这是一个非常有用和全面的答案。这比我考虑的任何事情都要好得多,这会让我在接下来的时间里省下一大堆头疼的事。