连接表大量增长

时间:2012-12-17 14:55:43

标签: mysql mongodb ruby-on-rails-3 database nosql

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

我有2个型号的用户和产品,用户有很多产品可供查看,产品属于很多用户如何查看。
启动时,所有用户都可以查看所有产品,用户可以编辑他可以查看的产品。

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

实施例: 我有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

我对所有解决方案持开放态度,从重新设计此部分开始使用另一个数据库系统。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我认为你的假设可能不是真的。即使有很多行,SQL服务器也可以快速处理这些类型的查询。如果你有很好的指数,可以很快查询有1000万条记录的表。

在进行各种过早优化之前,我会建议进行一些测试。

答案 1 :(得分:0)

你看过Neo4J吗?这是一个记录完备的图形数据库,在我看来,它非常适合这个特定的用例。您对此进行建模的方式非常简单。

每个用户和每个产品都由一个节点表示。您要么在它们之间创建关系“IS_ABLE_TO_SEE”,要么不这样做。

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

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

对于没有图形数据库经验的人来说,Neo4J非常容易使用,正如我所说,它几乎是针对你在这里展示的用例。

答案 2 :(得分:0)

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

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

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

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