MySQL 1:N数据映射

时间:2017-08-28 15:07:05

标签: mysql join cartesian-product

有些东西真的让我烦恼,我不确定"是什么"做法。 如果我选择从我的数据库中获取联系人,则会涉及大量的联接。

它看起来像这样(大约60-70列):

byte[]

公司和人是1:1基数所以它直截了当。 但是"地址","沟通"和"类别"是1:n基数。

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

你们是如何与之合作的? 在我的PHP应用程序中,我总是写一些" Data-Mapper"数组键是" contact.ID又名'&34;然后检查它是否存在,然后将其他数据推入其中。此外,PHP并不是真正的类型严格,因此很容易。

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

我也试过了GROUP_CONCAT,但后来遇到麻烦解析它。

我是否必须再次执行我的映射方法,或者那里有一些不错的解决方案?我觉得这点很脏吗?

1 个答案:

答案 0 :(得分:1)

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

所有"重复的原因"行是您正在生成名为Cartesian product的结果。您正尝试使用1:n关系连接到多个表,但这些表中的每一个都与另一个没有任何关系,因此没有连接条件将它们相互限制。

因此,您可以获得所有1:n关系的每个组合的结果。如果您在address中有3个匹配,communication中有5个匹配,categories中有5个匹配,那么您将获得3x5x5 = 75行。

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