在ER图中实现专业化。

3

ER图

我想实现这个专业化关系。考虑到每种账户类型都有不同的属性,以下是我的尝试:

accounts(account_id, email, username, password, ...)
user_accounts(account_id, ..)
admin_accounts(account_id, ..)
messages(subject, body, from_account_id, to_account_id)

其中,user_accounts和admin_acounts中的account_id是主键和外键,引用了accounts表中的account_id。
而messages表中的from_account_id和to_account_id也引用了accounts表中的account_id。

但如果我只想与其中一种账户类型建立关系,该怎么办呢?比如我想让管理员有权限管理某些内容,那么我可以这样做:

permissions(admin_account_id, type, value, ..)

admin_account_id是一个外键,参考了admin_accounts上的account_id字段。

这是否可行?如果我尝试为user_account_id输入权限会发生什么?

希望我的问题清晰明了,对我的英语表达请多包涵。


权限是一个表吗? - smk
是的,这只是一个示例,用来说明与其中一个帐户类型(admin_accounts)的关系。 - Kareem Mohamed
但是如果您后来决定开发人员账户也应该获得某些权限呢? - Ja͢ck
实际上,在我的新设计中,我没有开发者账户,只有管理员账户和用户账户。而且用户不可能拥有这些权限。 - Kareem Mohamed
2个回答

1

所以我假设你的权限表具有对管理帐户表的外键引用。如果是这样,由于参照完整性,您只能为存在于管理帐户表中的帐户ID添加权限。这也意味着,您将无法输入用户帐户ID [假设没有重复!]


不会有重复,因为它们都引用了账户表上的主键,并且这是一个完全独立的关系。谢谢,所以为了确保这是正确的实现方式? - Kareem Mohamed

1
你可能需要研究两种技术:
通过将这两种技术应用于你的情况,你可能会得到一个比你提出的设计更简单但更强大的设计。在某些情况下,你可以完全不使用TypeID,因为广义表和适当的专门表之间的连接将精确地产生你要查找的对象。此外,由于连接是基于两个主键,所以连接速度相对较快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接