Похоже, что это может стать огромным, поэтому я возьму первый и пройду, как бы подойти к нему. У вас не есть, чтобы сделать это так, это всего лишь один из способов обойти это. Обратите внимание, что вам, возможно, придется создавать таблицы запросов для каждого из ваших 4 описанных выше сценариев. Эта таблица будет решена только для первого сценария.
Прежде всего, я создам тип для адреса издателя.
CREATE TYPE address (
street text,
city text,
state text,
postalCode text
);
Далее Я создам таблицу под названием booksByPublisher
. Я буду использовать свой address
тип для publisherAddress
. И я создам свой ПЕРВЫЙ КЛЮЧ с publisherid
в качестве ключа раздела, кластер на bookYear
и isbn
.
Поскольку вы хотите иметь возможность запрашивать все книги определенного издателя, имеет смысл обозначить это как ключ раздела.Может оказаться полезным, чтобы ваши результаты отсортированы в год или, по крайней мере, смогут посмотреть конкретный год для определенного издателя, поэтому у меня есть bookYear
в качестве первого ключа кластеризации. И, конечно, чтобы создать уникальную строку CQL для каждой книги в издателе, я добавлю isbn
для уникальности.
CREATE TABLE booksByPublisher (
publisherid UUID,
publisherName text,
publisherAddress frozen<address>,
publisherPhoneNo text,
bookName text,
isbn text,
bookYear bigint,
bookCost bigint,
bookAuthor text,
PRIMARY KEY (publisherid, bookYear, isbn)
);
INSERT INTO booksByPublisher (publisherid, publishername, publisheraddress, publisherphoneno, bookname, isbn, bookyear, bookcost, bookauthor)
VALUES (b7b99ee9-f495-444b-b849-6cea82683d0b,'Crown Publishing',{ street: '1745 Broadway', city: 'New York', state:'NY', postalcode: '10019'},'212-782-9000','Ready Player One','978-0307887443',2005,812,'Ernest Cline');
INSERT INTO booksByPublisher (publisherid, publishername, publisheraddress, publisherphoneno, bookname, isbn, bookyear, bookcost, bookauthor)
VALUES (b7b99ee9-f495-444b-b849-6cea82683d0b,'Crown Publishing',{ street: '1745 Broadway', city: 'New York', state:'NY', postalcode: '10019'},'212-782-9000','Armada','978-0804137256',2015,1560,'Ernest Cline');
INSERT INTO booksByPublisher (publisherid, publishername, publisheraddress, publisherphoneno, bookname, isbn, bookyear, bookcost, bookauthor)
VALUES (uuid(),'The Berkley Publishing Group',{ street: '375 Hudson Street', city: 'New York', state:'NY', postalcode: '10014'},'212-333-2354','Rainbox Six','978-0425170342',1999,867,'Tom Clancy');
Теперь я могу запросить все книги (из моих 3-х строк), опубликованный Crown Publishing (publisherid=b7b99ee9-f495-444b-b849-6cea82683d0b
), как это:
[email protected]:stackoverflow2> SELECT * FROM booksbypublisher
WHERE publisherid=b7b99ee9-f495-444b-b849-6cea82683d0b;
publisherid | bookyear | isbn | bookauthor | bookcost | bookname | publisheraddress | publishername | publisherphoneno
--------------------------------------+----------+----------------+--------------+----------+------------------+-------------------------------------------------------------------------------+------------------+------------------
b7b99ee9-f495-444b-b849-6cea82683d0b | 2005 | 978-0307887443 | Ernest Cline | 812 | Ready Player One | {street: '1745 Broadway', city: 'New York', state: 'NY', postalcode: '10019'} | Crown Publishing | 212-782-9000
b7b99ee9-f495-444b-b849-6cea82683d0b | 2015 | 978-0804137256 | Ernest Cline | 1560 | Armada | {street: '1745 Broadway', city: 'New York', state: 'NY', postalcode: '10019'} | Crown Publishing | 212-782-9000
(2 rows)
Если я хочу, я могу также запросить для всех книг Короны Издательство в течение 2015 года:
[email protected]:stackoverflow2> SELECT * FROM booksbypublisher
WHERE publisherid=b7b99ee9-f495-444b-b849-6cea82683d0b AND bookyear=2015;
publisherid | bookyear | isbn | bookauthor | bookcost | bookname | publisheraddress | publishername | publisherphoneno
--------------------------------------+----------+----------------+--------------+----------+----------+-------------------------------------------------------------------------------+------------------+------------------
b7b99ee9-f495-444b-b849-6cea82683d0b | 2015 | 978-0804137256 | Ernest Cline | 1560 | Armada | {street: '1745 Broadway', city: 'New York', state: 'NY', postalcode: '10019'} | Crown Publishing | 212-782-9000
(1 rows)
Но я не могу запрос, просто bookyear
:
[email protected]:stackoverflow2> SELECT * FROM booksbypublisher WHERE bookyear=2015;
InvalidRequest: code=2200 [Invalid query] message="Cannot execute this query as it might
involve data filtering and thus may have unpredictable performance. If you want to execute
this query despite the performance unpredictability, use ALLOW FILTERING"
И не слушайте сообщение об ошибке и добавьте ALLOW FILTERING
. Это может работать нормально для таблицы с тремя строками (или даже 300). Но он не будет работать для таблицы с 3 миллионами строк (вы получите тайм-аут). Cassandra работает лучше всего, когда вы запрашиваете полный ключ раздела. Поскольку publisherid
является нашим ключом раздела, этот запрос будет работать отлично. Но если вам нужно запросить bookYear
, тогда вы должны создать таблицу, которая в качестве ключа разбиения использует bookYear
.
Поиск всех издателей, которые до сих пор не издавали книги (т. Е. Искать всех издателей, которые не публикуют ни одной книги) –