2016-02-20 10 views
1

Я очень новичок в NoSQL и денормализации. Тем не менее, я хотел бы, чтобы действия на SignUp в мое приложение определяется как:Как правильно денормализовать данные в Firebase

  1. Если имя пользователя уже занято, то пользователь не имеет права использовать его
  2. Если телефонный номер уже занят, то пользователь не имеет права использовать его
  3. Разрешить новому пользователю «синхронизации» свой номер телефона контакты с сервером, чтобы определить, кто в настоящее время пользователи, и извлекать их соответствующие UID-х

я схема описано, как ниже, учитывая быструю необходимость проверить, нет ли имени пользователя/телефона nu mber уже присутствует на пользователя зарегистрироваться, а также необходимого обслуживания и учитывая, если новые пользователи контакты номера телефонов ссылку для пользователей, уже присутствующих в приложении:

{ 
    "presentUsersByPhoneNumber" : { 
    "1614#######" : { 
     "uid" : "fdb17f3a-7b7d-4aa5-9a0b-b9fb33c349de" 
    }, 
    "1614#######" : { 
     "uid" : "99e4989b-a046-4c5f-9478-5ebd8bdc3ded" 
    }, 
    "1614#######" : { 
     "uid" : "1783917f-00e4-47a0-b2cd-987bdf185129" 
    }, 
    "1614#######" : { 
     "uid" : "a96da7b1-7c4e-44bc-b82e-fc75bed52bcd" 
    } 
    }, 
    "presentUsersByUsername" : { 
    "ak" : { 
     "uid" : "a96da7b1-7c4e-44bc-b82e-fc75bed52bcd" 
    }, 
    "ak2" : { 
     "uid" : "99e4989b-a046-4c5f-9478-5ebd8bdc3ded" 
    }, 
    "ak3" : { 
     "uid" : "1783917f-00e4-47a0-b2cd-987bdf185129" 
    }, 
    "kja" : { 
     "uid" : "fdb17f3a-7b7d-4aa5-9a0b-b9fb33c349de" 
    } 
    }, 
    "users" : { 
    "1783917f-00e4-47a0-b2cd-987bdf185129" : { 
     "phoneNumber" : "614#######", 
     "username" : "ak3" 
    }, 
    "99e4989b-a046-4c5f-9478-5ebd8bdc3ded" : { 
     "phoneNumber" : "1614#######", 
     "username" : "ak2" 
    }, 
    "a96da7b1-7c4e-44bc-b82e-fc75bed52bcd" : { 
     "phoneNumber" : "1614#######", 
     "username" : "ak1" 
    }, 
    "fdb17f3a-7b7d-4aa5-9a0b-b9fb33c349de" : { 
     "phoneNumber" : "1614#######", 
     "username" : "kja" 
    } 
    } 
} 

такой подход идет слишком справедливо в акт denormalizaiton?

ответ

1

В NoSQL вы должны моделировать данные о том, как ваше приложение должно получить к нему доступ. Прочтите это для получения дополнительной информации.

Так что если вам нужен эффективный способ проверить, был ли уже выбран номер телефона или имя пользователя, имеет смысл хранить сопоставления для них. Единственное, что я бы, вероятно, сделать разные там хранить их в виде простых типов:

"phoneNumberToUid" : { 
    "1614#######" : "fdb17f3a-7b7d-4aa5-9a0b-b9fb33c349de" 
    "1614#######" : "99e4989b-a046-4c5f-9478-5ebd8bdc3ded" 
}, 
"usernameToUid" : { 
    "ak" : "a96da7b1-7c4e-44bc-b82e-fc75bed52bcd" 
    "ak2" : "99e4989b-a046-4c5f-9478-5ebd8bdc3ded" 
} 

Одна вещь, которую я заметил в ваших данных образцов является то, что вы имеете в presentUsersByUsername ключевую ak, но нет соответствующего ребенка в users с этим name. Обычно это происходит потому, что ваш код либо прерывается на полпути, либо потому, что вы совершили ошибку в какой-то момент во время разработки.

Вы можете предотвратить многие из этих проблем:

  1. с помощью обновления мультиместоположения, так что все записи отправляются Firebase как единая команда

    ref.update({ 
        '/users/a96da7b1-7c4e-44bc-b82e-fc75bed52bcd/username': 'ak1', 
        '/usernameToUid/ak': null, 
        '/usernameToUid/ak1': 'a96da7b1-7c4e-44bc-b82e-fc75bed52bcd' 
    }); 
    

    Это обновление является безопасным способом чтобы изменить имя пользователя от ak до ak1, протирая старое сопоставление и добавляя новое.

  2. с использованием правил проверки убедитесь, что пользователь для каждого имени существует

    "usernameToUid": { 
        "$username": { 
        ".validate": "newData.parent().parent().child(newData.va()).child('username').val() == $username" 
        } 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^