我想实现这种专业化关系。知道每种帐户类型都有不同的属性。这是我的尝试:
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是主键,外键引用帐户上的account_id
而from_account_id,邮件中的to_account_id引用帐户上的account_id。
但是,如果我只想与其中一种帐户类型建立关系,会发生什么。例如,我想授予管理员管理权限的权限,所以我会这样做:
permissions(admin_account_id, type, value, ..)
admin_account_id是外键,在admin_accounts上引用account_id
这可能吗?如果我尝试输入user_account_id的权限,会发生什么?
我希望我的问题清楚,并原谅我的英语。
答案 0 :(得分:1)
因此,我假设您的权限表具有对admin_accounts表的外键引用。如果是这样,由于参照完整性,您只能为管理帐户表中的帐户ID添加权限。这也意味着你将无法输入user_account_id [假设没有重复!]
答案 1 :(得分:1)
您可能希望了解两种技巧:class-table-inheritance和shared-primary-key。
通过将这两种技术应用于您的案例,您最终可能会得到比您建议的更简单,更强大的设计。在某些情况下,您可以完全省去TypeID,因为通用表和相应的专用表之间的连接将精确地生成您要查找的对象。此外,由于连接位于两个主键上,因此连接速度相对较快。