в меру моих знаний я должен создать 4 таблицы и сделать первичные ключи ... «внешних ключей», а не я?
Вы определенно не хотите этого делать. Прежде всего, в Кассандре не существует внешних ключей. Во-вторых, вы говорите о моделировании с реляционной точки зрения. С помощью Cassandra вы не хотите, чтобы данные для одного запроса распространялись по нескольким таблицам, потому что это могло быть распространено на нескольких узлах. И запрос нескольких узлов вводит больше сетевого времени в уравнение, которое происходит медленно.
В Cassandra вы хотите использовать подход, основанный на запросе. Иногда это может означать одну таблицу для каждого запроса. Имея это в виду, я слышу, что вы должны запросить свои свойства двумя способами: (? MLS)
По существу, вы должны иметь стол для обслуживания каждого из этих запросов:
CREATE TABLE housesbymls (
mls text,
city text,
price bigint,
propertytype text,
state text,
street text,
year bigint,
zip text,
PRIMARY KEY (mls));
CREATE TABLE housesByCity (
mls text,
street text,
city text,
state text,
zip text,
propertyType text,
price bigint,
year bigint,
PRIMARY KEY ((state,city),zip,mls));
После upserting некоторых данных, я могу запросить по MLS:
[email protected]:stackoverflow> SELECT * FROM housesByMLS WHERE mls='09110857';
mls | city | price | propertytype | state | street | year | zip
----------+----------+--------+------------------+-------+--------------------------------+------+-------
09110857 | Palatine | 104900 | Condominium Unit | IL | 1025 North Serling Avenue, 211 | 1978 | 60067
(1 rows)
И я могу запросить государственным/города или штата/Город/Почтовый индекс:
[email protected]:stackoverflow> SELECT * FROM housesByCity
WHERE state='IL' AND city='Palatine';
или:
[email protected]:stackoverflow> SELECT * FROM housesByCity
WHERE state='IL' AND city='Palatine' AND zip='60067';
Оба эти возвращения:
state | city | zip | mls | price | propertytype | street | year
-------+----------+-------+----------+--------+------------------+--------------------------------+------
IL | Palatine | 60067 | 09110857 | 104900 | Condominium Unit | 1025 North Serling Avenue, 211 | 1978
(1 rows)
Идея позади структура PRIMARY KEY на этом состоит в том, что state
и city
составляют ключ разделения (который помогает Cass andra выясняет, где поставить эту строку в кластере), поэтому они оба требуются. Затем, поскольку города могут иметь несколько кодов zip
, вы также можете сфокусировать свой запрос на этом.ПЕРВЫЕ КЛЮЧИ в Кассандре уникальны, поэтому я положил mls
на конец, чтобы обеспечить уникальность.
Спасибо SOO много, Аарон за ваш блестящий и всеобъемлющий ответ. Это именно то, что мне нужно, я уже поступил неправильно. Мне нужно некоторое время, чтобы прочитать ваш ответ по строчке ... – Svitlana
@Svitlana Glad Я мог бы помочь! Другое сообщение о SO, которое может вам помочь, - это ответ Карло о различных типах ключей в Cassandra и их использовании: http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key- and-clustering-key-in-cassandra/24953331 # 24953331 – Aaron
Спасибо, Аарон. Попробует прочитать и понять перед реализацией :-). Клиенты всегда хотят, чтобы это было сделано завтра, и обычно мне нужно сделать это дважды :-). Благодарю вас за ваше время, Аарон! – Svitlana