Передовой опыт работы с облачным гаечным ключом ЧЕРЕЗ ВОПРОСЫ

Возьмем таблицы, определенные в документах:

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
) PRIMARY KEY (SingerId);

CREATE TABLE Albums (
  SingerId     INT64 NOT NULL,
  AlbumId      INT64 NOT NULL,
  AlbumTitle   STRING(MAX),
) PRIMARY KEY (SingerId, AlbumId),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

CREATE TABLE Songs (
  SingerId     INT64 NOT NULL,
  AlbumId      INT64 NOT NULL,
  TrackId      INT64 NOT NULL,
  SongName     STRING(MAX),
) PRIMARY KEY (SingerId, AlbumId, TrackId),
  INTERLEAVE IN PARENT Albums ON DELETE CASCADE;

Итак, у нас есть 3 таблицы: Singers, Albums и Songs . Таблица Альбом INTERLEAVE Singers и таблица Songs INTERLEAVE Singers и Альбомы.

Мой вопрос в том, хотим ли мы искать всю информацию о конкретном певце, можем ли мы искать в таблице «Песни», если у певца есть альбом, но еще нет песни? Если нет, то лучше всего получить все данные исполнителя (все альбомы и песни (если они есть)). Я думал искать в таблице Songs, если мы ничего не находим в Songs (потому что у певца может быть альбом, но песни находятся в разработке) искать в таблице Album, а затем в Singer (потому что даже альбом может быть в разработке), но я не не думаю, что это лучшее решение.

В моем случае пользователь, который делает запрос, не знает, есть ли у певца песни или альбомы, но хочет получить всю информацию о певце (если возможно, за один раз).


person Sergiu    schedule 15.09.2017    source источник


Ответы (2)


Я бы рекомендовал использовать СОЕДИНЕНИЯ, потенциально избегая трех отдельных читает (что-то вроде ..)

select singers.singerId, albums.albumId, songs.trackId 
from singers left join albums ON singers.singerId = albums.singerid 
left join songs ON songs.SingerId = singers.singerId
order by singerId, albumId;

Чтение из дочерних / чередующихся таблиц без соответствующих строк возвращает пустые результаты, поэтому требуется 3 отдельных запроса на чтение:

 
  select * from albums order by singerId, albumId;
  SingerId      AlbumId     AlbumTitle

   1            1           Total Junk  
   1            2           Go, Go, Go  
   .. more rows .. 
 

Хотя запрос к дочерней таблице - это не возвращает результатов, так как в таблице нет Songs дляingerId = 1:

select * from songs where singerId = 1 order by singerId, albumId; 

Никаких результатов. Запрос не вернул ни одной строки.

PS - не уверен, что вы подразумеваете под «сплитом» здесь - «получить всю информацию о певце (в одном сплите, если возможно)».

person snehashah    schedule 15.09.2017

Я пришел к двум решениям:

  1. В этом случае у нас есть 3 сканирования таблицы: певцы, альбомы, песни.

    select singers.singerId, album.albumId, songs.trackId
    от певцов
    покинул присоединение к альбомам ON singers.singerId = album.singerid
    покинул присоединение к песням ON альбомов. Albumid = songs.albumid

  2. Сделайте одну таблицу вроде:

Схема таблицы:

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  AlbumId INT64,
  SongId INT64,
  .
  .(informations about Singer, Album and Song)
  .
) PRIMARY KEY (SingerId);

Итак, у нас будет что-то вроде:

SingerId AlbumId  SongId  SingerName AlbumName SongName
   1                        Singer 1
   1        1                          Album 1
   1        1       1                           Song 1
   1        1       2                           Song 2
   1        1       3                           Song 3
   1        1                          Album 2
   1        2       1                           Song 1
   1        2       2                           Song 2
   1        2       3                           Song 3

И с помощью 1 запроса мы можем получить все данные о Singer. (У нас есть 1 сканирование большой таблицы, а не 3, но я не знаю, насколько это целесообразно, потому что снова сервер разделит данные между серверами, поэтому мы закончим с несколькими выборками. между разделениями).

Какое решение, по вашему мнению, работает лучше всего, и если у вас есть что-то, чего мне не хватает, пожалуйста, объясните.

person Sergiu    schedule 16.09.2017