Я исхожу из фона SQL, поэтому у меня возникла проблема с проектированием моей схемы firebase nosql. Я привык к тому, что могу запросить что-либо, используя предложение WHERE, и это кажется труднее сделать в firebase (хотя производительность EASILY компенсирует это!).Застрял при разработке схемы для базы данных моей базы firebase
Я храню объекты «дорожки» для песен. Эти объекты имеют пары ключ/значение, таких как ARTIST_NAME, название трека, жанр, рейтинг, CREATED_DATE и т.д., как показано ниже:
tracks
|_____-JPl1zwOzjqoM8xDTFll
|____ artist: "Bob"
|____ title: "so long"
|____ genre: "pop"
|____ rating: 52
|____ created: 1403129692781
|
|_____ -JPv7KnVi8ASQJjRDpvh
|____ artist: "Mary"
|____ title: "im alright now"
|____ genre: "rock"
|____ rating: 70
|____ created: 1403129692787
поведение по умолчанию на моем сайте будет перечислять все эти треки, с новейшим добавил в верхней части списка. Я могу установить мой приоритет $, который должен быть создан, и просто превратить его отрицательным (созданным * -1), чтобы добиться этого эффекта, я полагаю.
Но в будущем, я хотел бы иметь возможность фильтровать/запросить список с помощью других средств, например:
Извлечь все треки, которые имеют жанр рок, поп, хип-хоп или ,
Получить все треки, имеющие рейтинг 80 или более, и были добавлены за последние 7 дней.
Как можно достичь этого в firebase? Я понимаю, что на самом деле есть только два способа упорядочивания данных:
Через значение «ID», который имеет физическое местоположение «firebaseURL.firebaseio.com/tracks/id», который в моем случае , был автоматически выбран для меня, когда я добавляю трек. Это нормально (я думаю), поскольку у меня есть страницы для отдельных страниц треков, в которых перечислены подробности, а URL-адрес моего сайта - это что-то вроде «www.mysite.com/tracks/-JPl1zwOzjqoM8xDTFll».
Используя $ priority, который в моем случае я использовал для «созданного» значения, чтобы упорядочить список в правильном порядке даты.
Учитывая то у меня есть все настроить (и, пожалуйста, дайте мне знать, если есть лучший способ), есть способ, которым я могу легко запросить для определенных жанров или конкретных оценок?
Я прочитал блог «Денормализация ваших данных - это нормально» (https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html), и я думаю, что понимаю. Из того, что описывает Anant, один из способов добиться того, что я хочу, будет, возможно, будет создавать новый объект в firebase для жанра и перечислить все треки там, например, так:
tracks
|______ All
|_____ -JPlB34tJfAJT0rFT0qI
|_____ -JPlB32222222222T0qI
|_____ -JPlB34wefwefFT0qI
|______ Rock
|_____ -JPlB32222222222T0qI
|_____ -JPlB34tJfAJT0rFT0qI
|______ Pop
|_____ -JPlB34wefwefFT0qI
предпосылки в блоге, в том, что пространство жесткого диска было дешево, но времени пользователя нет. Таким образом, все в порядке, чтобы дублировать данные, поскольку это позволяет быстрее читать.
Это имеет смысл, и я бы не прочь этот метод. Но это будет работать только в том случае, если пользователь хочет выбрать все треки только из одного жанра. Что, если они хотят получить все треки от BOTH rock AND pop? Должен ли я хранить другой объект под названием Rock & Поп и хранить трек там каждый раз, когда кто-то подает песню любого жанра?
genre
|_______pop-rock
|_________ -JPlB34tJfAJT0rFT0qI (a rock song)
|_________ -JPlB34wefwefFT0qI (a pop song)
|_________ -JPlB32222222222T0qI (a rock song)
Кроме того, было бы больше смысла, чтобы сохранить весь объект дорожки или просто ссылку, используя TrackID?Например, под/жанр/поп:
Есть ли разница в производительности между двумя способами? Я думаю, что, возможно, последний будет быстрее, поскольку мне не нужно будет запрашивать каждый отдельный трек для других деталей, но я просто хочу быть уверенным.
Я уже несколько раз переделал схему firebase. Я сделал некоторые улучшения, но по мере того, как мое приложение становится все больше, его изменение становится более дорогостоящим и потребляет больше времени. Было бы неплохо, если бы я смог получить эти вопросы в последний раз, прежде чем потратить много времени на повторную переделку остальной части моего кода, чтобы снова соответствовать этому.
Спасибо за любую помощь в этом, это очень оценили. И, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.