(我的网站是使用PHP和MySQL构建的。)
我的用户数据库结构主要由2个表组成:“医生”和“客户”。
但是,为了集成聊天系统,我需要创建第三个表,即'chat_users',它结合了医生和客户:'chat_users'表的字段是
userid (unique integer),
username,
type (0:client, 1:doctor),
refid (id of the user in the associated clients or doctors table)
但是每次插入/更新/删除客户端或医生时,我都不想手动插入/删除/更新此表。我前段时间听说过级联表......
这样做的最佳方式是什么?我怎样才能实现它?
答案 0 :(得分:1)
你需要的是一个AFTER INSERT触发器。这将允许您创建新用户。如果您希望在更新时更新它并在删除原始记录时删除,那么您也需要这些触发器。
CREATE TRIGGER `chat_users_insert` AFTER INSERT ON `doctors`
FOR EACH ROW BEGIN
INSERT INTO `chat_users` SET user_id= NEW.id;
END;
上面会插入一条记录并设置id的值。 http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html可以为您提供准确的语法。如果您需要任何具体说明,请与我们联系。
答案 1 :(得分:1)
我不确定你会认为这是一个“答案”,但我可以评论你的数据库架构吗?
从长远来看,如果有下列表格,你会更开心:
user_account: (ua_id, ua_email, ua_username, ua_password, etc.)
doctor: (d_id, ua_id, etc.)
customer: (c_id, ua_id, etc.)
换句话说,让你的关系走向另一个方向。然后,如果您希望通过简单地删除user_account来删除医生或客户,您可以添加以下关系约束:
ALTER TABLE `doctor`
ADD CONSTRAINT `doctor_fk_user_account` FOREIGN KEY (`ua_id`) REFERENCES `user_account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `customer`
ADD CONSTRAINT `customer_fk_user_account` FOREIGN KEY (`ua_id`) REFERENCES `user_account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
答案 2 :(得分:1)
我知道,不完全是您问题的答案,但是使用旧式视图呢?这样可以避免完全存储冗余数据。
CREATE VIEW chat_users AS
SELECT drid uid, drid userid, drname username, 0 FROM doctors
UNION ALL
SELECT clid+100000, clid, clname, 1 FROM clients
只有当您的表中没有超过100000名医生时,此视图才会有唯一的uid
(否则请选择更高的偏移量)。这种方法的优点是不需要维护依赖表数据。
答案 3 :(得分:1)
“每次插入/更新/删除客户端或医生时,我都不想手动插入/删除/更新此表。”
你为什么要担心这件事?去做就对了。您有应用程序要求,因此除非您能够弄清楚如何统一您的客户和医生表,否则将需要与您的聊天功能相关的第三个。
在应用程序框架中添加它的难度几乎为零,只是在创建客户端或医生时创建附加记录,并在删除相应记录时删除它。
此处的其他答案建议使用视图或触发器来模糊实际发生的事情。这通常是一个坏主意,这意味着您的应用程序不负责自己的数据,基本上将某些应用程序逻辑功能的控制权移交给数据库本身。
最好的解决方案往往是最明显的,因为这会减少未来的意外。