Каков наиболее эффективный способ структурирования моей многоязычной базы данных SQLite? - PullRequest
0 голосов
/ 22 октября 2019

Я создаю мобильное приложение для поиска и управления коллекцией игральных карт (примерно 10 000). Каждая карта имеет характеристики, которые являются общими для всех языков, и четыре строки для каждого языка: название, эффект1, эффект2 и символ. Только ограниченное количество карт имеет ненулевой эффект2 и характер (менее 10%). Некоторые карты могут быть доступны на некоторых языках, но не на других.

Я использую SQLite для локального хранения базы данных карт и использую sqflite для доступа к ней (мое приложение создано с помощью Flutter, ноЯ не думаю, что это имеет какое-либо значение для моего вопроса).

Моя первоначальная идея состояла в том, чтобы хранить всю независимую от языка информацию в таблице cards и всю информацию, зависящую от языка, в таблице card_texts с одной строкой на пару (card_id,language).

Однако работа с ответом, который генерирует этот запрос, раздражает, поскольку приводит к нескольким строкам на карту (по одной на язык), и мне пришлось бы уменьшить это вручнуюв коде клиента.

Причина, по которой я не делаю только одну таблицу на язык и называю ее день, заключается в том, что, поскольку некоторые карты существуют на некоторых языках, а не на некоторых других, я хочу иметь возможность перейти к другойязык при необходимости. Например, я мог бы перечислить карточки на французском языке, но если карточка не была переведена на французский, получи ее на английском языке, а если она не была переведена на английский, то получи ее на японском языке.

Моя вторая идея состояла в том, чтобыиметь все языки в одной строке для каждого идентификатора карты в card_texts, так что в результате объединения создается только одна строка для каждой карты. Для этого я поместил в него 33 столбца (card_id + 4 столбца TEXT на язык). Это было удобнее, потому что я мог получить все языки для каждой карты и перенести логику «отступления» в код клиента, но я не уверен, что очень эффективно иметь таблицу такого размера, когда в большинстве случаев мне нужнотолько один язык.

Моя третья идея - создать одну таблицу для каждого языка, каждая из которых имеет 5 столбцов (card_id + 4 столбца TEXT). Однако я должен либо присоединиться ко всем этим, либо выполнить несколько запросов, если я хочу вернуться к другому языку.

Вот действия, которые я хочу выполнять максимально эффективно (особенно потому, что это будетзапустить на мобильном телефоне):

  1. Получить информацию об одной карте + текст на моем языке по умолчанию + откат на другие языки, если карта не была переведена, в заданном порядке (например, попробуйте французский, затем английский), затем японский)
  2. Сделайте то же самое для нескольких карт (один запрос, чтобы получить все карты, соответствующие определенным критериям)
  3. Уметь искать карты на всех языках, используя некоторую строку
  4. В идеале, иметь возможность объединить это с другими таблицами, которые могут иметь несколько строк для одной карты (и поэтому я бы хотел избежать максимально возможного умножения количества строк на карту)

Учитывая мои ограничения по производительности и размеру (я хочу, чтобы это работало на недорогих мобильных телефонах с базой данных, возможно, на медленной SD-карте),лучше иметь большее количество столбцов, выполнить больше JOIN или выполнить несколько запросов? Есть ли другое решение, о котором я не думал?

...