Какой способ хранения этих конкретных данных будет более эффективным?
У меня есть база данных для игры - в настоящее время используется MySQL для хранения информации - и я хочу протестировать ArangoDB для сравнения скорости.
Мне интересно, было бы лучше хранить всю информацию об игроке в одной коллекции или было бы более эффективно (или даже просто лучше практиковать) разделять их.
В MySQL у меня действительно не было выбора, но я использую ArangoDB.
Например, хранение информации инвентаризации в MySQL:
+---------------------------+
| user_id | item_id | count |
+---------+---------+-------+
| 1 | 1 | 7 |
| 1 | 2 | 4 |
+---------+---------+-------+
Или в ArangoDB я могу сделать либо:
Единый сборник для всей информации:
{ _key: "Unique User ID", health: 100, money: 52.38, // .... , inventory: { item1: 7, item2: 4 // , .... } }
Разделите вышеупомянутую коллекцию на два разных (один для здоровья, денег и т. Д. И один для данных инвентаризации):
// 'user' collection { _key: "Unique User ID", health: 100, money: 52.38, .... } // 'inventory' collection { _key: "Unique User ID", item1: 7, item2: 4 // , .... }
Какой из двух методов выше (или даже другой, о котором я не думал) будет более эффективным?
1 ответ
Ну, ответ зависит от того, как вы ожидаете данные, используемые вашим приложением. Вот несколько советов о том, как мне выбрать способ хранения данных:
Меняются ли данные инвентаризации нечасто и обычно ли они необходимы при доступе к пользовательской информации? Если это так, то вам, вероятно, лучше всего использовать вариант 1 (хранение данных инвентаризации вместе с информацией о пользователях).
Хотите сделать переход от реляционного хранилища документов к максимально безболезненному? Тогда вы, вероятно, можете использовать вариант 2 с отдельными коллекциями. Arangodb поддерживает объединения по всей коллекции и работает довольно хорошо.
Теперь, если вы не возражаете против некоторой кривой обучения, я бы предложил вариант 3: обход графиков. В этом случае вы должны хранить данные способом, аналогичным следующему:
// коллекция пользовательских вершин
{ _key: "1", здоровье: 100, деньги: 52,38,....}
// элемент коллекции вершин
{itemID: 1, //,....},
{itemID: 2 //,....}
// инвентаризация края
{ _from: пользователь \1 _to: item\1, количество: 7},
{ _from: пользователь \1 _to: item\2, количество: 4 }
Поскольку ArangoDB имеет встроенную поддержку обхода графа, вышеуказанная настройка оптимизирована для действительно быстрого поиска. Основное правило при начале перехода от реляционных баз данных к графам состоит в том, что основные таблицы становятся коллекциями, а промежуточные (объединяющими) таблицами становятся реберными коллекциями. (очевидно, это еще не все, но это хорошее начало)
Если бы я начинал с нуля, я бы сначала выбрал вариант 3. Однако, как я уже упоминал в начале, это зависит от того, как вы собираетесь использовать данные.