2011-11-01 72 views
3

(不知道什么叫其... ..模型架构..超级模特?)卡桑德拉:制作一个数据模型/模式

我有“N”(唯一id'd)中的“m”传感器(独特id'd)家园。这些火灾中的每一个都是每天0次到'k'次(1-5次方块)。目前此数据存储在MySQL与表中的每个“家”和的结构:

time stamp 
sensor id 
firing count 

林有麻烦缠绕我的脑海里围绕这个数据“的NoSQL”的模式,让我找到的数家中,时间或传感器发射。

..或者,这可能不是推向nosql的正确数据类型?我们当前的服务器在负载下(数亿行×数百个家庭)陷入困境。我非常有兴趣找到一个允许cassandra可扩展性的数据存储。

+0

为什么你有一个单独的表,而不是一个表和一个外键?此外,您每秒接收多少个传感器测量值,它们有多大,以及您需要对它们执行哪种分析? – user359996

回答

1

存储由传感器和房子烧计数:

House_Sensors  <-Column family 
    house_id  <-Key 
    sensor_id  <-Column name 
    firing_count <-Column value 

在JSON上下的符号表示的数据

House_Sensors = { 
house_1 : { 
    sensor_1: 3436, 
    sensor_2: 46, 
    sensor_3: 99, 
    ... 
}, 
house_2 : { 
    sensor_7: 0, 
    sensor_8: 444, 
    ... 
}, 
... 
} 

您可能需要定义与sensor_id另一列家庭作为关键存储射击时间戳。

在设计模式和根据需要进行非规范化时,请考虑您需要哪些查询。重复数据,Cassandra插入速度非常快。

触发的时间戳不存储在House_Sensor列族中。以sensor_id为关键字创建一个新的列族。

这样,您可以使用House_Sensor系列查询触发次数以及每个房屋所属的传感器。使用另一列家族来查询射击时间戳。

+0

因此,在'house_1'中,我可以有20K个'sensor_1'的发射,每个都有某种时间戳? (这个印章将由传感器提供,并独立于卡桑德拉时间戳) – ethrbunny

+0

另外 - 如果我有第二列家庭这是否意味着所有的数据存储两次? – ethrbunny

+0

如果您使用第二列家族,这意味着所有数据都存储了两次。从你的问题来看,你不清楚你需要如何读取数据,但是如果第二列家族只是使用列名的时间戳,每次发射一个(值可以是空的),它可以让你得到一个精确的给定的时间范围和传感器。当然,这是一个比阅读单个计数器更昂贵的查询。 –

2

这取决于。认为“查询第一”的方针:

  1. 识别查询
  2. 模型的数据

所以,虽然你可能有一个柱族这是你的物理模型,你也将有一个或多个它在查询时提供数据。并且,您可以进一步利用Cassandra的功能,例如:

列名称可以包含数据。你不必来存储的值,每个名字可能是一个时间戳,例如

它非常适合于存储数千列的每个键和列将保持排序,并且可以向前访问或相反的顺序;因此,继续上面的例子,可以很容易地获得传感器所有时间戳列表

复合数据类型允许您将多位数据组合到键,名称或值中。例如结合内部ID和传感器ID

计数器列提供了一个简单的增值,即使是初始值,所以只是一直写操作。

索引可以在静态列名这实际上提供了一个反向柱族与键的结果被定义,只是要小心桶大小(例如可能不希望值,以毫秒)