多个表或多个字段

时间:2012-07-16 22:26:23

标签: database cakephp database-design relational-database

这样做的最佳方法是什么?为什么?

以下是我数据库设计的一部分,我正在寻找组织这些数据的最佳方法。

"Leads" has many "Students", Leads has many "Contacts"

"Students" belongs to "Leads" and belongs to "People"
   id, person_id, lead_id

"Contacts" belongs to "Leads" and belongs to "People"
   id, person_id, lead_id

我希望能够表明哪个联系人将成为“付款人”,以及联系人是否是主要联系人。

我原本以为我会再添加两个这样的表:

"PrimaryContacts" belongs to "Contacts"
   id, contact_id
"Payer" belongs to "Contacts"
   id, contact_id

然后我意识到,在初始的Contacts表中添加两个表,我可以很容易地表示它似乎有点过分了

"Contacts"
  id, person_id, lead_id, type, payer

然后我可以将类型设置为1或2,即主要或次要,然后付款人字段将为1或2,这意味着他们要么付款,要么不付款。

以某种方式做到这一点有什么好处,还是有意义呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不得不承认我对你的要求感到有些困惑,但从字面上解释你说的话似乎会导致以下数据库模型:

enter image description here


Contacts.payer标志可让您拥有任意数量的付款人,无论其主要状态如何。

在这种情况下,确实不需要单独的Payer表。


Leads.primary_contact_idContacts是一个可以使用NULL的FK,这样可以让每个线索有0或1个主要联系人(为了避免0个主要联系人的可能性,你需要一个NOT NULL,但是这会导致一个插入周期,这个周期必须通过延迟约束来解决,这在MySQL中是不受支持的。

但是,这并不能保证主要联系人属于自己的潜在客户(即Contacts.lead_id可能与Leads.lead_id不同,即使Contacts.contact_id匹配Leads.contact_id)。那是问题吗?如果是,您需要自由应用识别关系和复合PK,这可能是ORM的问题。

单独的PrimaryContacts表与Leads.primary_contact_id具有非常相似的效果(假设您的PK正确),甚至会出现允许0主要联系人和潜在客户不匹配的相同问题。从数据库的角度来看,只是拥有一个“向后”的FK更简单,更有效(尽管我不确定从CakePHP的角度来看是否仍然如此)。

不幸的是,我对CakePHP并不熟悉 - 希望你能够自己“翻译”这个模型。