交叉链接数据的数据库设计

时间:2016-06-17 00:11:03

标签: database rdbms nosql

我没有很多NoSQL数据库(甚至是关系数据库)的经验,所以我不确定如何为我的数据设计一个好的存储架构。

在我的业务逻辑中,我有两种主要的对象;我们称之为容器和物品。每个对象都有一个唯一的ID。 Item可以属于多个Container,但大多数Items只属于一个Container。此外,项目可以相互链接。此链接没有相关的元数据,它只是一个标记,“项目a和b相互链接”。将有大约20万个集装箱,每个集装箱平均含有约5万件物品;但是,一些罕见的容器将有大约500万件物品(而其他一些物品则只有100件物品)。容器很少被删除或更新,但每隔几天就会创建一个新容器(以及新项目)。

以下是一些示例数据(我将使用名称而不是数字ID,因为ID很无聊):

  • 容器“A”
    • 项目“a1”
    • 项目“a2”
    • 项目“a3”
  • 容器“B”
    • 项目“b1”
    • 项目“b2”
  • 容器“C”
    • 项目“c1”
    • 项目“c2”
    • 项目“c3”
    • 项目“c4”
  • 关联商品:
    • 项目“a1”和“b1”已关联
    • 项目“a3”和“b2”已链接
    • 项目“b2”和“c4”已链接
    • 项目“a1”和“c2”已链接

我需要相对快速地回答以下问题(每个请求不超过10秒,包括传输数据所需的时间;理想情况下,1秒):

  • 给定一个Container ID,列出该Container中的所有Items,包括它们的Item ID以及每个Item的一些元数据。在这种情况下,如果我被问到“给我容器A中的所有项目”,我会回复“{(a1,a1.metadata),(a2,a2.metadata),(a3,a3.metadata)}”< / p>

  • 给定两个Container ID,找到这两个Container之间链接的所有项目对。如果我被问到“A中的哪些项目与B相关联”,我会回复,“{(a1,b1),(a3,b2)}”

  • 给定一个引用Container,找到所有其他容器,其中至少有一个Item链接到该引用Container中的Item;另外,计算实际链接的项目数。如果我被问到“哪个容器包含与A相关联的项目?”,我会回答:“{(B,2),(C,1)}”

  • 给定一个项目,找到链接到它的所有其他项目。如果我被问到“哪些项目与a1相关联?”,我会回复“{b1,c2}”。

大多数容器中只有少数(如果有)项目链接在一起;但是,有些容器会将~90%的物品链接起来。

那么......我应该如何存储这些数据?我的第一个选择当然是使用你的SQL关系数据库,因为它非常简单 - 你只需要创建四个表(例如,ITEM,CONTAINER,ITEM_CONTAINER_MAP,ITEM_LINK),你就完成了。不幸的是,Oracle和MySQL都无法足够快地处理大量数据。我无法使用任何AWS基础架构,因此Redshift和DynamoDB已经淘汰(我们的客户被禁止使用云服务)。那么,有什么想法吗?

我为这篇冗长的帖子道歉;不幸的是,我甚至不知道我不知道是什么......

0 个答案:

没有答案