You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Michael Cherkasov <mi...@gmail.com> on 2012/02/26 23:32:56 UTC

how to cast traditional sql schema to nosql

Hi all,
I'm newbie in nosql and can't understand how to create nosql style schema.
First, I what describe my problem:
 I need to store results of tests. Each test consists of a list of
parameters(if tests have the same list of parameters that means, two tests
belong to the same testcase), tag or tags, and test result,
For exmaple:
Test1 :
 params:
   -user_role:admin
   -miss_captcha:true
   -test_name:login_test
   -locales:en,es,fr       -- as you can see, parameter can be the list.
testcase: testcase_1_id -- test case id formed as md5 of params.
tags:
   -aaa_site_test
   -smoke
 result:
   -passed
   -some_other_results_stuff( logs, errors' codes and so on )
 start_time: 1330287048  ( time stamp)
Test2 :
 params:
   -user_role:admin
   -miss_captcha:true
   -test_name:login_test
   -locales:en,es,fr       -- as you can see, parameter can be the list.
 testcase: testcase_1_id -- test case id formed as md5 of params.
 tags:
   -aaa_site_test
   -function_tests
 result:
   -failed
   -some_other_results_stuff( logs, errors' codes and so on )
 start_time: 1330290648
Test3 :
 params:
   -user_role:user
   -miss_captcha:true
   -test_name:change_password
   -locales:en
 testcase: testcase_2_id -- test case id formed as md5 of params.
 tags:
   -bbb_site_test
   -function_tests
 result:
   -failed
   -some_other_results_stuff( logs, errors' codes and so on )
 start_time: 1330290648

So, above you can see 3 tests, the first two belong to the same testcase,
but test 1 and test 2 are different test runs, also they have different
tags. Test 3 one more test case.
Usually I will need to execute the following queries:
1)Get latest result for specific tag/tags, for exmale:
Get latest result for aaa_site. Result should be:
Test2 result, because test 1 and test 2 is the same test case, but test 2
is newer.
2)Or get latest result for locale == es, result is test 2.
3)Get the latest results for each test case, result is: test 2, test 3.
4)Get get history for test case 1, result: test 1 and test 2.

I create the following schema:
TestRuns:
*test run id(key) | test case id  | start_time | result id*
test_1_id        | testcase_1_id | 1330287048 | result_1
test_2_id        | testcase_1_id | 1330290648 | result_2
test_3_id        | testcase_2_id | 1330290648  | result_3

Result:
*result id | result_value | other stuff...*
result_1  |  passed      | ...
result_2  |  failed      | ...
result_3  |  failed      | ...

ParamsAndTags:( for tags I put $tag for tagParamName, $ - for case if we
have parameter with name 'tag'  )
*key (not used, but required by cassandra)| test run id | tagParamName |
value*
some key                                 |test_1_id    | $tag         |
aaa_site_test
some key                                 |test_1_id    | $tag         |
smoke
some key                                 |test_1_id    | user_role    |
admin
some key                                 |test_1_id    | miss_captcha | true
some key                                 |test_1_id    | test_name        |
login_test
some key                                 |test_1_id    |  locales          |
en           --- list is splited
some key                                 |test_1_id    |  locales          |
es           --- list is splited
some key                                 |test_1_id    |  locales          |
fr           --- list is splited
and so on...


But it's look very heavy to perform queries.
To take latest result for tag aaa_site_test and with locale es I need
perform the following steps:
Fetch all rows from ParamsAndTags with tag aaa_site_test, then fetch all
rows for param locale == es.
Then find intersection of first and second result so I receive test runs
id, but this is not the end.
After that I should fetch test runs and in result find the latest results
only.
As you can see for that simple query I should perform 3 query to DB and a
lot of work inside my application to merge results and filter latests
results.
I'am afraid it will work too slowly.
Can someone advise more nosql solution for this task?