HBase - Каковы плюсы и минусы использования одного столбца со списком значений по сравнению с использованием одного семейства столбцов со списком столбцов?
Скажем, мы моделировали пользователей и друзей, и у друзей есть тип.
Мы могли бы смоделировать это в Oracle, как:
User: id, name, sex, age
Friendship: user_id, friend_id, type
Так что в HBase мы могли бы сделать:
(эта первая модель отсюда, которая рекомендована HBase FAQ)
Table: Users
RowKey = <user_id>
Column Family = Info; Columns = "Name", "Sex", "Age"
Column Family = Friend; Columns = "Friend:<user_id>"=type
(где "Friend:"=type может быть еще одним user_ids)
или же
Table: Users
RowKey = <user_id>
Column Family = Info; Columns = "Name", "Sex", "Age", "Friends"
(где "Friends" - это строка JSON в форме [{user_id:, type:}, ...]
Однако, если у друга не было типа, вторая модель могла бы быть просто [user_id:<user_id>, ...]
, Что бы сделала первая модель, если бы у друзей не было типа?
Каковы плюсы и преимущества любого подхода?
2 ответа
Один столбец со списком значений нарушает правила нормализации. Если вы не знаете, что это такое или почему они важны, пожалуйста, сделайте небольшое исследование.
Я не думаю, что любая из этих моделей верна. Отношение один ко многим должно быть смоделировано правильно. Обе ваши схемы нарушают правила нормализации.
Это действительно зависит от того, сколько у вас друзей и какова ваша схема доступа для чтения и записи.
В первом случае, добавив друга в столбец, вы можете добавить друга, не читая всех остальных друзей. Однако вы также получаете отдельное значение метки времени для каждого друга и, таким образом, увеличиваете общее требование к памяти для друга.
Кроме того, если вы не всегда читаете друзей, когда читаете пользователя, в первом случае вам не нужно загружать друзей. Вы можете выполнить сканирование семейства с одним столбцом и избежать всех дополнительных операций ввода-вывода.
Недостатком большего количества семейств столбцов является то, что у вас больше MemStores и, следовательно, для ваших регионов требуется больше памяти. Это также означает более непоследовательную очистку диска, поскольку каждое семейство столбцов является отдельной очисткой диска.