我的应用程序数据库(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
我对所有解决方案持开放态度,从重新设计此部分开始使用另一个数据库系统。
提前致谢。
答案 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,如果需要的话。
在这两种情况下,它都会胜过任何类型的查询。