0

(我的网站是使用 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)

但我不想每次插入/更新/删除客户或医生时手动插入/删除/更新此表。我前段时间听说过级联表...

在性能方面这样做的最佳方式是什么?我怎样才能实现它?

4

4 回答 4

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;
于 2013-08-28T16:02:47.360 回答
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可以为您提供准确的语法。如果您需要任何具体说明,请告诉我。

于 2013-08-28T15:55:17.960 回答
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

uid仅当您的表中没有超过 100000 名医生时,此视图才会具有唯一的 s(否则选择更高的偏移量)。这种方法的优点是不需要维护相关的表数据。

于 2013-08-28T16:09:00.687 回答
1

“我不想在每次插入/更新/删除客户或医生时手动插入/删除/更新此表。”

你为什么要为此烦恼?去做就对了。您有应用程序要求,因此除非您能弄清楚如何统一您的客户和医生表,否则您需要与您的聊天功能相关的第三个。

在应用程序框架中添加它的难度几乎为零,只是在创建客户或医生时创建附加记录,并在删除各自记录时将其删除。

这里的其他答案建议使用视图或触发器来掩盖真正发生的事情。这通常是一个坏主意,这意味着您的应用程序不负责自己的数据,基本上将某些应用程序逻辑功能的控制权交给了数据库本身。

最好的解决方案通常是最明显的,因为这样可以减少未来的意外。

于 2013-08-28T16:23:50.830 回答