在我的数据库中,我有3个表:problems
,users
和roles
。 roles
表具有2个值:client和coach。
数据库规则:
problems
实体具有指向users
表的两个外键:coach_id和client_id。我可以使用Android Room添加检查约束以确保问题遵守此规则吗?
我想避免问题有两个客户或两个教练的情况。
数据库概念图
当前ROOM不支持添加CHECK约束。
但是,您可以通过删除表然后创建表来引入CHECK约束(这可能是不希望的,因为这可能会带来持续的复杂性,例如在迁移时)。但是,CHECK约束是有限的,不能包含子查询,我认为这会使事情复杂化,甚至可能排除存在合适/可用的CHECK约束。
coach INTEGER CHECK((SELECT authority FROM user JOIN role ON role.roleid = user.role) = 0) REFERENCES user(userid) ON DELETE CASCADE ON UPDATE CASCADE,
的信息(假设由于不清楚哪一列表示角色类型,教练必须拥有一个权限为0的角色)。但是,不能使用CHECK,因为它会导致CHECK约束中禁止的子查询错误。因此,在插入问题的过程中,以编程方式进行这种检查可能会更简单。也就是说,对于每种类型(教练/客户),从用户那里获得角色,并且如果指定了错误的角色,则拒绝实际插入数据库。这更类似于Room的OO立场(即表支持并根据对象创建)。