0

さて、これは簡単な問題ですが、ソリューションの実装方法に問題があります。

したがって、データベース構造は次のようになりますが、必要なものはすべて大幅に削減されています。

テーブルイベント、連絡先、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

あなたは私が何を確信していないか知っていますが、私はちょうど正しい論理を話したと思いますが、これがとにかくそれがどのように行われるべきか、または私の論理に欠陥があるかどうかについてのフィードバックに本当に興味があります。何かが足りないような気がします。

ありがとう!

4

1 に答える 1

1

私には良さそうに見えますが、次のように変更することで、コードをより読みやすくすることができます。

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

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

私はこれを2つの別々のチェックに分割することで解決しました. 考えられるすべてのケースを処理しようとする代わりに、コードを「何をしようとしているのか」というチャンクに分割しました。最初のものは、連絡先が存在することを確認することです。そうでない場合は、作成します。

次に、contact_event_role テーブルを更新します。

共通コードを移動することでこれを行うこともできます。たとえば、「INSERT INTO contact」を 2 回呼び出していましたが、「check4contact」が false だったために両方とも呼び出されました。これは、ロジックをクリーンアップする 1 つの方法です。

于 2013-02-08T04:41:57.477 に答える