2017-09-15 103 views
0

讓我們以表定義了文檔:雲扳手最佳實踐交錯問題

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個表歌手相冊歌曲。表專輯交錯歌手和表歌曲交錯歌手相冊

我的問題是,如果我們想這樣搜索關於某個歌手的所有信息,我們可以在表歌曲中搜索,如果歌手有專輯但沒有任何歌曲嗎?如果不是最好的做法是檢索歌手的所有數據(所有專輯和歌曲(如果有的話))。如果我們沒有在歌曲中找到任何東西(因爲歌手可以有一個專輯,但歌曲正在開發中),我想在表歌曲中搜索,然後在歌手中搜索(因爲即使專輯可以在開發中),但我不會不認爲這是最好的解決方案。

在我的情況下,查詢的用戶不知道歌手是否有歌曲或專輯,但想要回顧關於歌手的所有信息(如果可能,在一個分割中)。

回答

0

我得出兩個解決方案:

  1. 在這種情況下,我們有3個表掃描:歌手,專輯,歌曲。

    選擇 singers.singerId,albums.albumId,songs.trackId
    從歌手
    左加入專輯ON singers.singerId = albums.singerid
    左加入歌曲albums.albumid =歌曲。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個查詢,我們可以收回所有關於歌手的數據(我們有1張大表掃描不是3,但我不知道它是否最好因爲再一次,服務器將在服務器之間分割數據,所以我們將以分割之間的多個選擇結束)。

你認爲哪種解決方案效果最好,如果你有什麼我想念的請解釋。

0

我建議使用JOINs,潛在地避免了3個獨立的讀出(沿着線的東西..)

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 .. 

雖然查詢一個子表 - 這不返回任何結果,因爲該表沒有歌曲爲singerId = 1:

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

沒有結果。 該查詢未返回任何行。

PS - 不確定你是什麼意思的「拆分」在這裏 - 「檢索關於歌手的所有信息(如果可能,在一個分割中)」。