2012-07-16 61 views
0

这样做的最佳方式是什么?为什么?多个表格或多个字段

这里快速浏览一下我的数据库设计的一部分,我正在寻找组织这些数据的最佳方法。

"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这意味着它们要么支付或它们不是。

以某种方式做这种做法有利还是不重要?

谢谢!

+2

会有多个主要联系人吗?'type'和'payer'之间是否有任何相互依赖关系(即允许所有组合)?另外,定义单词“属于” - 它是否表示N:1关系或继承(或其他)? – 2012-07-17 08:14:39

+0

每个导联只有一个主要联系人。联系人可以是付款人和主要联系人,或者既不是或者两者都是,所有组合都将被允许。属于意味着N:1的关系。谢谢! – 2012-07-17 15:39:25

+0

@Brian:然后,你不应该说*“PrimaryContacts”**属于**“Contacts”*,但是*“PrimaryContacts”**是**“Contacts”* – 2012-07-17 19:34:04

回答

1

我不得不承认我对你的要求有点困惑,但是从字面上解释你说什么似乎导致了下面的数据库模型:

enter image description here


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

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


Leads.primary_contact_id是对Contacts一个为空的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并不熟悉 - 希望您能够自己“翻译”这个模型。

+0

谢谢您参与的答案!那么,仅仅在联系人表中添加一个“类型”字段并将其设置为1代表主要代码,将其设置为2代表副作用会有什么不利呢?是不是每个潜在客户可以有多个主要联系人? – 2012-07-17 20:53:12

+0

@Brian _是不是只有这样,每个潜在客户可能会有多个主要联系人?_正确。 – 2012-07-17 20:56:18