2012-12-17 60 views
1

我在我的应用程序的数据库(MySQL)中大量增长了一个连接表。连接表大量增长

我有2个模型的用户和产品,用户有许多产品来查看,并且产品属于许多用户将如何查看它。
开始时,所有用户都可以查看所有产品,用户可以编辑他可以查看的产品。

表格大小为(n * m)n的问题是用户数量(大),m是产品数量(也很大),对表格的读操作会很慢。

例子: 我有3个用户相应的ID: “1,2,3”
和3个产品的ID的: “1,2,3”

所以users_products表将是:

USER_ID,PRODUCT_ID
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3

我向所有人开放的解决方案,从重新设计这部分使用其他数据库系统启动。

在此先感谢。

+1

“并且在桌子上阅读操作将会很慢。”你为什么认为这会很慢?你有任何经验证据来支持这一说法吗?你尝试过添加索引吗? –

+1

您的想法是经典的解决方案。请记住,此表只有2个字段,'user_id'列上的索引会产生快速结果。 – Moka

+0

@EranBane:我知道这个记录只有2个整数,不会占用这么大的空间,但我在这方面正在调查,以防止将来出现问题。 – Aboelnour

回答

1

我想你的假设可能不是真的。即使有很多行,SQL服务器也可以快速处理这些查询。如果您有好的指数,那么拥有1000万条记录的表格可以被快速查询。

我会推荐一些测试,然后再进行各种过早的优化。

0

你看过Neo4J吗?它是一个记录良好的图形数据库,在我看来,它是这个特殊用例的完美选择。你对建模的方式很简单。

每个用户和每个产品都由一个节点表示。您可以在它们之间创建一个关系“IS_ABLE_TO_SEE”,或者不要。

然后,您可以使用一系列功能再次检索此数据。我最喜欢的是使用遍历,从一个节点开始,然后你遍历关系(你可以选择走哪些方向和哪个方向)。但是,这对于检索远离彼此的几个级别深度的数据更有用。

在我们的特定用例中,您可以通过关系“IS_ABLE_TO_SEE”执行一个简单查询,返回连接到用户节点的所有产品节点。

对于没有图形数据库经验的人来说,Neo4J非常容易使用,正如我所说的,它非常适合您在这里介绍的用例。

0

正如Pieter-Jan用Neo4J指出的那样,还有其他解决方案,我是Couchbase和Neo4J的忠实粉丝。这是一个简单的列表,关系表不太适合这些操作。

在Couchbase中,您可以通过多种方式执行此操作,其中一种方法是使用简单的client.append来保存产品列表,然后使用单个client.get来检索列表。有了这两种可能性,在追加之前重复数据删除或重复数据删除之后。抓住列表非常快,将会消除任何形式的查询。

另一种方法是使用JSON,并拥有用户可以访问和查看的每个产品的数组等等。与第一个示例中的简单字符串相同,除非您可以在Map/Reduce上进行操作它是否在JSON中,如果需要的话。

在这两种情况下,它都会胜过任何类型的查询。