2011-11-16 83 views
2

我需要您的帮助来设计简单登录服务的结构。它包含大约100.000.000个客户,每个客户可以拥有大约10个不同的登录名 - 这导致1.000.000.000个不同的登录名。Cassandra - 登录服务的数据设计解决方案

每个客户包含以下数据:

  • 一对多登录名字符串,最多20 UTF-8长
  • ID只要角色 - 一个客户只有一个ID
  • 性别
  • 出生日期
  • 密码MD5

登录过程需要通过登录名找到用户。

Cassandra中的数据被复制 - 这是在单次调用中获取所有必需的登录数据所必需的。我们通常也期望低写入流量和繁重的读取流量 - 应避免读取数据的往返行程。

下面,我描述了两个可能的Cassandra的数据模型基于例如:我们有两个用户,第一用户有两种登录和第二个用户有三个登录

A)窄身行

  • 行密钥包含登录名 - 这是主要搜索条件
  • 登录数据被复制 - 每个可能的登录信息存储为包含所有用户数据的单个行 - 单个客户的10个登录信息创建10行,每行有不同的密钥和相同的c ontent
 

    // first 3 rows has different key and the same replicated data 
     [email protected] { 
      id: 1122 
      gender: MALE 
      birthdate: 1987.11.09 
      name: Alfred Tester 
      pwd: e72c504dc16c8fcd2fe8c74bb492affa 
     }, 
     [email protected] { 
      id: 1122 
      gender: MALE 
      birthdate: 1987.11.09 
      name: Alfred Tester 
      pwd: e72c504dc16c8fcd2fe8c74bb492affa 
     }, 
     [email protected] { 
      id: 1122 
      gender: MALE 
      birthdate: 1987.11.09 
      name: Alfred Tester 
      pwd: e72c504dc16c8fcd2fe8c74bb492affa 
     }, 

    // two following rows has again the same data for second customer 
     [email protected] { 
      id: 1133 
      gender: MALE 
      birthdate: 1997.02.01 
      name: Manfredus Maximus 
      pwd: e44c504ff16c8fcd2fe8c74bb492adda 
     }, 
     [email protected] { 
      id: 1133 
      gender: MALE 
      birthdate: 1997.02.01 
      name: Manfredus Maximus 
      pwd: e44c504ff16c8fcd2fe8c74bb492adda 
     } 

B)行由字母前缀分组

  • 行数是有限的 - 用于从登录名例如第一个字母
  • 每一行包含良性与行的所有登录键“a”包含所有以“a”开头的登录
  • 数据可能不平衡,但我们避免了行数过薄 - 这可能会带来积极的表现冲击(??)
  • 以避免超列各行直接包含列,其中列名是用户登录名和列值实物序列化形式的相应的数据(我想有是人类可读的)
 

    a { 
     [email protected]:"1122;MALE;1987.11.09; 
           Alfred Tester;e72c504dc16c8fcd2fe8c74bb492affa", 

     [email protected]@xyz.de:"1122;MALE;1987.11.09; 
           Alfred Tester;e72c504dc16c8fcd2fe8c74bb492affa", 

     [email protected]@xyz.de:"1122;MALE;1987.11.09; 
           Alfred Tester;e72c504dc16c8fcd2fe8c74bb492affa" 
     }, 

    m { 
     [email protected]:"1133;MALE;1997.02.01; 
        Manfredus Maximus;e44c504ff16c8fcd2fe8c74bb492adda"  
     }, 

    r { 
     [email protected]:"1133;MALE;1997.02.01; 
        Manfredus Maximus;e44c504ff16c8fcd2fe8c74bb492adda"  

     } 

哪种解决方案更好,尤其是读取性能?你有更好的主意吗?

+0

你有什么“更好”的标准?性能,清晰度,可扩展性等? – DNA

+0

仅限速度和速度。 –

回答

2

这是一个crosspost位,但我会继续并在这里回答你的问题。

如果您始终使用登录名作为查找键,那么您基本上正在构建一个键值存储。如果你像一个人一样使用Cassandra,Cassandra肯定会成为一个很棒的关键价值商店,这将成为你的瘦身排行模式。

当您有更复杂的查询来回答时,例如处理时间序列数据,列表或集时,将使用宽行。宽行数据模型有时被描述为“更高性能”的原因是因为它们为那些稍微复杂的查询类型提供了非常好的性能。试图使用瘦行模式来回答这些类型的查询可能是非常低效的。

但是没有必要扭曲键值存储以使其适合宽行模型 - 它将在皮包骨架的行中表现完美。

+0

谢谢你的回答! –