在这种情况下实现关系和强制数据库完整性的最佳方法是什么?

时间:2013-03-09 17:14:44

标签: mysql database-design relational-database

我正在使用CakePHP 2和MySQL创建一个相对简单的应用程序。

此应用程序有Users,主要是Admin有权访问管理面板的用户。

然后有CustomersCustomers可以填写注册表。只有在Customer用户批准Admin后,才会为Customer创建用户记录,以便客户可以登录。

显然,我需要将UserID存储在CustomerID,因此我可以将用户记录与Customer记录相关联。

这是否意味着我需要第三个表格,其中仅包含UserIDCustomerID,只有在Customer获得批准后才会填充该表格。

编辑:只是补充一下,目前,每个“客户”只获得1个“用户”,因此是1:1的关系。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你的数据库中已经有两个表了:

UsersUserID, Name, AccessRights

CustomersCustomerID, Name, OtherSTuff

现在您要在这些表之间创建关系。这里要问的问题是:单个客户可能存在多少用户,以及有多少客户可能与任何给定用户有关。

我个人猜测,单个客户可能有多个员工访问您的数据库,但每个(非管理员)用户只能与一个客户关联。这将是1:N的关系:1个客户有N个用户。要相应地更改数据库模型,只需在CustomerID表中添加Users列。

如果我的猜测是错误的,并且有1个用户拥有N个客户:一个用户要访问多个客户,那么您需要UserID表中的Customers列。

当您需要第三个​​表时,唯一的时间点是N个客户拥有M个用户,这意味着:当一个用户可以访问多个客户时多个用户可以访问单个客户。

编辑:我完全省略了并强制执行数据库完整性部分。

MySQL支持FOREIGN KEY子句 - 至少在与某些存储引擎(如InnoDB)一起使用时,我认为MyISAM仍然没有。 foreign key子句允许该列中的值匹配外表中的现有值或NULL。如果不需要此行为,则需要将列声明为NOT NULL

您可以设置用户,以便管理员拥有CustomerID NULL而普通用户设置CustomerID。但有一个问题:确保您不使用ON DELETE SET NULL子句,否则删除客户将使相应的用户成为管理员。请改用ON DELETE CASCASE