我有一个访问控制类型设置。我有两张桌子,"用户"和"门"。 users表包含一些信息,例如唯一ID,名字和姓氏以及电子邮件地址。门板上有门的ID,门的名称,读卡器的IP地址,以及是内门还是外门等信息。
我想要一个第三个表,其中一列名为"用户ID",还有Doors表中每个Door ID的列(值为varchar长度为20),每个用户都有一行“用户”表中的ID。
如果这是静态的,我会自己完成创建它的时间。但这是动态的。我将添加门,添加/删除/更改用户ID。
保持所有这些信息同步的最简单方法是什么?如果它很重要,我有几个与表交互的PHP脚本。
答案 0 :(得分:2)
你认为太复杂了。只需创建第三个表“用户门”即可。有两列:' userid'和' doorid'。创建一个结合这两列的唯一索引。
为每个用户门关系添加一行。每个门的用户ID将重复多次,但这很好。
现在,您只需检查用户是否可以访问门(我假设您正在做的事情)"从userdoors中选择userid,其中userid = [userid]和doorid = [doorid]"如果此查询返回结果,则用户可以访问。
这称为n:m关系。你可以在例如更多地了解它。 https://en.m.wikipedia.org/wiki/Many-to-many_(data_model)
您还可以添加超过两列的内容,例如' time'为了节省用户被授予这个特定门的时间或者被授予“授权”的权利。保存授予此特定关系的用户。
答案 1 :(得分:0)
您不需要为每个用户提供单独的表格,您需要crosslink table来建立用户与门之间的关系(它被称为many-to-many relation。)< / p>
但是,要回答原始问题,那就是trigger的作用 - 它会在表格上的某些操作(插入/更新/删除)上执行一大块SQL代码。
答案 2 :(得分:0)
我已经设法通过使用PHP脚本来自动执行此功能而不是让数据库自己执行此操作来克服这个问题;这样我可以按照我想要的方式构建数据库。
脚本处理所有用户数据和门的数据添加到表格中。
因此,当我添加一个门时,脚本会在门表(包括该表中的所有列)中添加它,然后自动将其添加到访问控制表(所有读者查询的那个)。当我更改(或删除)门ID时(它可能会因为它的ID是读卡器的MAC地址而改变),脚本将在访问控制表中更改它。当我更改用户的信息时,同样的事情。如果用户ID发生变化(部分基于其访问卡的唯一ID,如果其卡更改可能会更改),则会反映在用户表和访问控制表中。
因此,表格中的任何内容之间不再存在任何联系,所有更改都是通过PHP单独完成的。唯一的缺点是,如果我直接编辑数据库,可能会导致数据不匹配。
答案 3 :(得分:-1)
我会尝试通过应用外键约束来解决数据库本身问题。
https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html