包含数据库完整性

时间:2013-02-08 04:13:07

标签: php mysql

好的,这是一个直截了当的问题,但我对如何实施解决方案存在疑问。

所以这就是数据库结构的样子,并且所需要的东西大大减少了。

Tables Event,Contact,contact_event_role,event_roles。

create table events(
  event_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(200) NOT NULL,
  PRIMARY KEY(event_id)
);

INSERT INTO events VALUES(1, 'stackoverflow');
INSERT INTO events VALUES(2, 'throwsanerror');

create table contacts(
  contact_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  fname VARCHAR(40) NOT NULL,
  lname VARCHAR(40) NOT NULL,
  email VARCHAR(90) NOT NULL,
  PRIMARY KEY(contact_id)
);

INSERT INTO contacts VALUES(1, 'bill', 'smith', 'bsmith@email.com');
INSERT INTO contacts VALUES(2, 'amy', 'lee', 'amylee@email.com');

event_roles(
  role_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  description VARCHAR(80),
  PRIMARY KEY(role_id)
);

//The roles look something like this
INSERT INTO event_roles VALUES(1, 'Event Coordinator');
INSERT INTO event_roles VALUES(2, 'Decision Maker');
INSERT INTO event_roles VALUES(3, 'Inquiry Contact');

contacts_event_role(
  event_id INTEGER UNSIGNED NOT NULL,
  contact_id INTEGER UNSIGNED NOT NULL,
  role_id INTEGER UNSIGNED NOT NULL,
  FOREIGN KEY(event_id) REFERENCES events(event_id),
  FOREIGN KEY(contact_id) REFERENCES contacts(contact_id),
  FOREIGN KEY(role_id) REFERENCES event_roles(role_id),
  PRIMARY KEY(event_id, role_id)
);

INSERT INTO event_role VALUES(1, 1, 1);
INSERT INTO event_role VALUES(1, 1, 2);
INSERT INTO event_role VALUES(2, 2, 1);

这就是数据库的要点。 带一点虚拟数据。很确定一切都很好而且很好。

所以这是我的逻辑

我要做的是插入/更新客户端和角色,并在必要时让客户端填充多个角色。

所以我的伪代码看起来像这样

//perform a check to see if the event_role is being filled...
check4role = SELECT * FROM contacts_event_role WHERE role_id = 1 AND event_id = 1

//perform a check to see if the contact already exists.
check4contact = SELECT * FROM contacts WHERE fname = :fname AND lname = :lname AND email = :email; 

//if the role is already being filled && contact exists 

if( check4role == true && check4contact == true)
  UPDATE contact_event_role

//else if the role exists and contact does not exists

elseif( check4role == true && check4contact == false)
  INSERT INTO contacts 
  UPDATE contact_event_role

//else if the role does not exists and the contact does exist

elseif( check4role == false && check4contact == true)
  INSERT INTO contact_event_role

//else if the role does not exists and the contact does not exist

elseif( check4role == false && check4contact == false)
  INSERT INTO contacts
  INSERT INTO contact_event_role

你知道我不确定但是我认为我只是说出了正确的逻辑,但我真的很感兴趣的一些反馈是否应该如何进行,或者我的逻辑是否存在缺陷。我觉得我错过了什么。

谢谢!

1 个答案:

答案 0 :(得分:1)

对我来说看起来不错 - 但是你可以让你的代码更容易阅读 改变它看起来像这样:

if (check4contact == false)
{
    insert into contacts
}

if (check4role == false)
{
    INSERT INTO contact_event_role
}
else
{
    UPDATE contact_event_role
}

我把它分成两个单独的检查来解决这个问题。我没有尝试只处理所有可能的情况,而是将代码分解为“你想做什么”的块。第一个是确保联系人存在。如果他们不这样做,我们就会创造它们。

然后第二部分正在更新contact_event_role表。

您也可以通过移出公共代码来完成此操作 - 例如,您两次调用“INSERT INTO contacts”,并且两次调用它都是因为“check4contact”为false。这是清理逻辑的一种方法。