2013-03-09 30 views
0

我使用CakePHP 2和MySQL创建了一个相对简单的应用程序。在这种情况下实现关系并实施数据库完整性的最佳方式?

该应用程序有Users,主要有Admin用户谁有权访问管理面板。

然后有CustomersCustomers可以填写注册表。只有一次的Customer已批准由Admin用户,对于Customer创建的用户记录,因此客户可以登录。

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

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

编辑:只需要添加,目前,每个“客户”只有1'用户',所以1:1的关系。

+0

难道你不能在你的'users'表上有'customer_id'字段吗? (没关系,我没有在帖子正文中看到你的问题) – 2013-03-09 17:19:21

回答

0

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

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

您可以设置您的用户,以便管理员拥有CustomerIDNULL,而常规用户的设置为CustomerID。但有一个问题需要解决:确保您不使用ON DELETE SET NULL条款,否则删除客户将使相应的用户成为管理员。改为使用ON DELETE CASCASE

+0

抱歉,我应该在我的问题中明确表示,目前这是1:1关系,每个客户只能获得1个用户。 我最初认为我可以在用户表中放置一个CustomerID,但对于管理员用户来说,CustomerID是NULL,所以我不能强制关系的完整性,对吗? – 2013-03-09 18:03:52

+0

您可以在具有NULL值的列上使用InnoDB的FOREIGN KEY子句。只有一个问题:不要使用ON DELETE SET NULL子句,否则删除一个客户将使相应的用户成为管理员。改用ON DELETE CASCASE。 – Hazzit 2013-03-09 18:25:03

+0

非常好,那正是我需要的。感谢Hazzit。我是否应该将您的答案标记为正确,还是您希望将您的评论转移到单独的帖子中,然后将其标记为答案? – 2013-03-09 20:12:33

相关问题