【问题标题】:Best way to implement relationships and enforce database integrity in this situation?在这种情况下实现关系和强制数据库完整性的最佳方法是什么?
【发布时间】:2013-03-10 05:56:06
【问题描述】:

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

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

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

显然我需要将UserIDCustomerID 存储起来,这样我就可以将用户记录与Customer 记录相关联。

这是否意味着我需要仅在 Customer 获得批准后才填充的仅包含 UserIDCustomerID 的第三个表?

编辑:只是补充一下,目前,每个“客户”只有 1 个“用户”,所以是 1:1 的关系。

【问题讨论】:

  • 您的users 表上不能只有一个customer_id 字段吗? (没关系,我没有在帖子正文中看到您的问题)

标签: mysql database-design relational-database


【解决方案1】:

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

UsersUserID, Name, AccessRights

CustomersCustomerID, Name, OtherSTuff

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

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

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

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

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

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

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

【讨论】:

  • 对不起,我应该在我的问题中说清楚,目前是 1:1 的关系,每个客户只能获得 1 个用户。我最初以为我可以在Users 表中放一个CustomerID,但对于管理员用户,CustomerID 将为NULL,所以我不能强制关系的完整性,可以吗?
  • 您可以在具有 NULL 值的列上使用 InnoDB 的 FOREIGN KEY 子句。只有一个问题:不要使用 ON DELETE SET NULL 子句,否则删除客户将使相应用户成为管理员。请改用 ON DELETE CASCASE。
  • 太好了,这正是我所需要的。谢谢哈兹特。我应该将您的答案标记为正确,还是要将您的评论移到单独的帖子中,我会将其标记为答案?
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多