Правильная структура базы данных Firebase для нескольких индексов - PullRequest
0 голосов
/ 16 октября 2018

Я все еще относительно новичок в Firebase, и было довольно странно отказываться от этого, учитывая мои знания по SQL.

Это моя желаемая таблица

Contracts
    ID
    PlayerID
    CompanyID
    Status
    ExpiryDate
    Etc...

В одной функции,Я хотел бы получить все контракты, где PlayerID = custom_playerid (чтобы получить все контракты одного игрока)

В другой функции я хотел бы получить все контракты, где CompanyID = custom_companyid (чтобы получить все контракты одной компании)

В другой функции я хотел бы получить один контракт, в котором Status = 0 и CompanyID = custom_companyid (посмотрите, есть ли в компании «невыполненный» контракт)

И в кронезадание, я бы искал все контракты, где CurrentDate> ExpiryDate и Status = 0, чтобы удалить их из базы данных.

Как мне подходить к этому?Я только что узнал, что не могу сделать несколько orderByChild, и это делает базу данных более сложной для новичков.

В какой-то момент я подумал о том, чтобы сделать несколько таблиц "ContractByCompany", "ContractByPlayer", что облегчило бы задачу, но я бы предположил, что было бы очень трудно исправить все столы, которые у меня сейчас есть, для этого.

1 Ответ

0 голосов
/ 16 октября 2018

Если вы новичок в базе данных NoSQL, я бы сначала порекомендовал прочитать эту статью о Моделировании данных NoSQL .Тогда, если вы пришли из опыта работы с реляционными базами данных, какие серии видео Firebase для разработчиков SQL .С этим материалом под вашим поясом вы будете в гораздо лучшей форме, чтобы рассуждать о моделях данных.: -)

Все три варианта использования, которые вы упомянули, кажутся возможными без пользовательских индексов.Первые два напрямую поддерживаются запросами к вашей текущей модели данных, в то время как последний (выполнение AND для двух значений) возможен путем введения синтетического составного свойства, такого как "Status_CompanyID": "0_custom_companyid", и последующего запроса с помощью ref.orderByChild("Status_CompanyID").equalTo("0_custom_companyid").Подробнее об этом подходе см. http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase

Тем не менее, можно также создавать собственные индексы.Фактически, в течение первых нескольких лет своей жизни Firebase не поддерживал orderByChild(), поэтому такие пользовательские индексы были единственным способом выполнения таких запросов.В этом случае вы получите три пользовательских индекса в дополнение к первичному узлу Contracts:

ContractByCompanyId
ContractByPlayerId
ContractByStatusAndCompanyId

Вы дублируете данные в этих узлах, где каждая операция записи в Contracts также приводит кв операциях записи по индексам.Это операция, очень похожая на то, что реляционная СУБД может делать автоматически за кулисами.В NoSQL это просто обрабатывается вашим собственным кодом, в процессе, известном как разветвление.

Первоначально может быть сложно написать код, чтобы поддерживать разветвленные данные в актуальном состоянии.Для наиболее распространенных стратегий для этого, смотрите Как записать денормализованные данные в Firebase .

...