sql - 是否有可能添加外键到表引用id列在同一个表
我有用户帐户系统需要子帐户系统。所以存在可以访问主账户数据的“主账户”和账户。我在想用户表中的字段“subaccount”是true还是false。然后根据“父帐户”字段打开“父帐户”引用的帐户标识数据。sql - 是否有可能添加外键到表引用id列在同一个表
你对此有何感想?
SELECT * FROM users WHERE id = :id
if("SUBACCOUNT" exists){
SELECT * FROM users WHERE id= :parentaccount
echo parentaccounddata
$_session['parentaccount'] = false; //restrict certain features
}
有可能有一个表通过外键约束引用自己的主键(至少它是在MySQL,但我不明白为什么其他的基于SQL数据库不会允许它)。
但是,我想提出替代解决方案。添加将连接帐户的新表格:
CREATE TABLE `accountConnection` (
`accountId` int NOT NULL,
`subAccountId` int NOT NULL,
PRIMARY KEY (`accountId`, `subAccountId`),
CONSTRAINT `fkAccountId` FOREIGN KEY (`accountId`) REFERENCES `account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fkSubAccountId` FOREIGN KEY (`subAccountId`) REFERENCES `account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我使用MySQL作为示例。这样,您可以在帐户和子帐户之间建立多种多样的关系,即使您现在不需要它,但我不确定您是否需要解决问题,但却是非常灵活的解决方案,如果您需要改变你的系统以允许它
如果有许多子帐户会怎么样? – H3ll1n 2014-09-12 10:17:30
这个解决方案的最大优点是每个账户都可以成为许多其他账户的“子账户”,同时它可以拥有许多其他账户作为“子账户”。如果帐户ID为1的子帐户的ID为3,5,10,则在连接表中有3行: {accountId:1 subAccountId:3},{accountId:1 subAccountId:5},{accountId :1 subAccountId:10} 每个新帐号/子帐号关系都会在连接表中添加一行 – Ajant 2014-09-12 10:32:19
此外,您还可以通过添加约束条件将每个帐号限制为只有一个超级帐号(它是子帐号的帐号) 'accountConnection'table的'subAccountId'列是唯一的。如果以后你决定删除这个restirction,就像删除一个约束一样简单。您不需要重大更改任何表格 – Ajant 2014-09-12 10:37:10
如果每个帐户只有一个父母,这是一个非常简单的实现。您想要创建一个id
和parent
列的用户表。如果该帐户是主帐户,则可以将parent
列设置为NULL。如果它是一个子账户,您可以将其设置为id
。
表创建
CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
-- other parameters like name, ip, ...
`parent` int(11) NULL,
PRIMARY KEY (`id`),
FOREIGN KEY(`parent`) REFERENCES `accounts`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT=1 ;
要检查它是否是一个主帐户或不只是检查父列设置为空或不是。
因此,您有两种类型的帐户,即管理员和用户的子帐户的主帐户。子帐户连接到一个主帐户,并且如果登录人员的帐户是子帐户而非主帐户,则您想要限制权限。我明白了吗? – 2014-09-11 08:40:47
是的。我希望该子账户可以查看并获取主要账户数据。 (之后关闭某些功能) – H3ll1n 2014-09-11 08:55:55