【问题标题】:Cassandra Database Data Model: Critic my schema designCassandra 数据库数据模型:批评我的架构设计
【发布时间】:2012-10-19 08:03:23
【问题描述】:

我需要为测试系统实现一个数据库。它旨在存储测试数据以供将来进行统计分析。它必须基于 Cassandra。

我已经设计了一个模式,但由于这是我第一次尝试 NoSQL 设计,我希望得到一些反馈。

我将首先描述我希望保存的数据,然后描述两个基本查询,最后介绍我建议的设计。

我打算使用 Cassandra 1.1,因此我尝试在我的设计中使用 Composite Columns,但是,请随意建议超级列或任何看起来正确的方法。

数据:

我们正在测试的基本单位是外星人。每个外星人都有一个唯一的 ID。每个外星人都有许多身体部位。此外,每个外星人都是外星人家庭的一部分。这些家族具有唯一的名称。

当我们运行测试时,我们会在外星人群体的几个身体部位上运行它。例如,我们选取​​了几个家庭,对他们所有的眼睛和嘴巴进行了测试。

有几种测试。我们使用它自己的测试唯一 ID 记录每个测试。

当我们进行测试时,我们会每隔几分钟对所有相关的外星人身体部位进行采样并收集一些统计数据。

基本查询:

  1. 每个家庭、外星人或独特的身体部位 - 它参与了哪些测试。
  2. 每个测试 ID - 哪些家庭或外星人或独特的身体部位参与了它。
  3. 未来对所有数据进行统计分析...

我的设计尝试:

GeneralAliensData : { // Column Family  - general data on aliens. 
    [FamilyID][AlienID][Bodypart] : { //Composite Columns as Row keys
        Race: 'Blurgons' // column
        Shoesize: 5 // column
        Favorite probe: 'fun, toy' // column
    }  
}

TestsData : { // Column Family - we sample each test every couple of minutes...
    [TestID][AlienID][Bodypart][MinutesFromTestStart]: { //Composite Columns as Rowkeys
        Temperture: 30 // column
        Size: 5 // column
    }  
}


BodypartTestParticipation : { // Column Family - all the tests a unique bodypart passed...
    [FamilyID][AlienID][Bodypart]: { //Composite Columns as Row keys
        TestID: 105 // column
        TestID: 564 // column
        ...
    }  
}

就是这样。由于我是数据库,尤其是 Cassandra 的真正初学者,因此我将不胜感激。

感谢您的宝贵时间。

【问题讨论】:

  • 这个问题似乎跑题了,因为它是一个代码审查请求。

标签: database-design nosql cassandra database-schema


【解决方案1】:

您的数据集最终会有多大的行数?我们使用 PlayOrm 将关系数据存储在 noSQL 中,有时效果很好,表可以进入 X 百万行。如果您要处理数十亿/万亿行,那么我们使用 PlayOrm 对相同的数据进行分区以便扩展。

那么,您需要扩展能力吗?您可能想查看宽行模式(PlayOrm 大量使用该模式)。宽行可以帮助您索引内容以实现非常快速的查找。

我真的不明白你的这部分内容

TestsData : { // Column Family - we sample each test every couple of minutes...
    [TestID][AlienID][Bodypart][MinutesFromTestStart]: { //Composite Columns as Rowkeys
        Temperture: 30 // column
        Size: 5 // column
    }  
}

这里不应该更宽吗?其中 testid 是行键,并且您有许多其他数据的复合名称?并且宽行不应大于 1000 万列,因此请确保没有测试数据行会超过该列。所以可能是宽排

testid -> alienId:fk23=null, alienId:fk25=null, etc. 等 tempture=30, size=5

后来, 院长

【讨论】:

  • 首先,感谢您花时间回答。我将尝试解释 TestsData 要求。我们对外星人(每个身体部位)进行测试。测试需要不同的时间,让我们选择一个需要 10 分钟的测试。一旦开始测试,我们每分钟对外星人身体部位的温度和大小进行采样,因此我们需要每分钟记录每个身体部位的数据。这就是为什么我提出的复合索引是 [TestID][AlienID][Bodypart][MinutesFromTestStart] 并且数据是两列。我对宽行模式不熟悉,是我设计错了吗?
  • 关于 PlayORM 的建议 - 谢谢,但我必须为此使用 Cassandra。
  • 不知道你的意思是什么,因为 Playorm 在 cassandra 之上?您的意思是您必须为此使用 astyanax 还是必须为此使用 hector?那条评论对我来说更有意义。
  • 我不明白 PlayORM 是什么。我认为那是另一个 NoSQL DB。我目前正在.NET 中开发,所以我使用的是 FluentCassandra。你是这个意思吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 2020-09-20
  • 1970-01-01
  • 2014-08-21
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多