2017-08-28 74 views
1

有些事情真的让我感到困扰,我不知道什么是“正确”的方法。 如果我选择从我的数据库中获取联系人,那么涉及的体积很大。MySQL 1:N数据映射

它会是这个样子(约60-70列):

SELECT * 
FROM contacts 
LEFT JOIN company 
LEFT JOIN person 
LEFT JOIN address 
LEFT JOIN person_communication 
LEFT JOIN company_communication 
LEFT JOIN categories 
LEFT JOIN notes 

公司和个人是1:1级的基数所以其直线前进。 但“地址”,“通信”和“类别”是1:n基数。

因此,根据1:n表中的行数量,我会得到很多“双”行(我不知道这是什么真正的术语,行不是双我知道地址或电话号码等不同)。对于我自己作为一个联系人,一个相当充满的联系人,我得到了85排。

你们是如何工作的? 在我的PHP应用程序中,我总是写一些“Data-Mapper”,其中数组键是“contact.ID aka primary”,然后检查它是否存在,然后将附加数据推送到其中。另外PHP并不是真正的严格类型,它使得它变得容易。

现在我正在学习GO(golang),并且我认为螺丝LOOOONG选择和数据映射只是为所有1:n写入选择....是的,没有足够的连接来加载充满联系人的表格。我知道我可以增加联系,但错误似乎暗示这将是错误的方式。 我使用以下驱动程序:https://github.com/go-sql-driver/mysql

我也尝试了GROUP_CONCAT,但后来我解决了麻烦的问题。

我必须再次执行我的映射方法吗?还是有一些很好的解决方案吗?我发现它很脏,点寿吗?

+0

我不知道什么是正确的或不正确的,但是您可以尝试1-> many作为foreach中的单独查询,并将结果粘贴到第一个查询的结果中。 – aynber

+0

联接太多。如果你的桌子变得非常大,它会变得非常缓慢。 – vladatr

+0

@vladatr是的,我知道,所以你说我应该通过“多个连接”来解决问题,也就是提高它或者建立一个队列? – Tiega

回答

1

解决方案很简单:您需要执行多个查询!

所有“重复”行的原因是您正在生成一个名为Cartesian product的结果。你试图用1:n的关系连接到几个表,但是每个表与另一个表没有关系,所以没有连接条件限制它们之间的相互关系。

因此,您将得到所有1:n关系的每个组合的结果。如果你在address有3场比赛,communication有5场比赛,categories有5场比赛,你会得到3×5×5 = 75行。

因此,您需要为每个1:n关系运行单独的SQL查询。不要害怕,MySQL可以处理一些查询。你需要他们。

+0

好吧,我明白你的观点,并充分理解这一点。我如何为电话号码创建搜索查询呢?我是否创建一个视图来查找Primary-id,然后继续说下去? – Tiega

+1

你可以做一个子查询,或两个单独的查询。 –