Я создаю мобильное приложение для поиска и управления коллекцией игральных карт (примерно 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). Однако я должен либо присоединиться ко всем этим, либо выполнить несколько запросов, если я хочу вернуться к другому языку.
Вот действия, которые я хочу выполнять максимально эффективно (особенно потому, что это будетзапустить на мобильном телефоне):
- Получить информацию об одной карте + текст на моем языке по умолчанию + откат на другие языки, если карта не была переведена, в заданном порядке (например, попробуйте французский, затем английский), затем японский)
- Сделайте то же самое для нескольких карт (один запрос, чтобы получить все карты, соответствующие определенным критериям)
- Уметь искать карты на всех языках, используя некоторую строку
- В идеале, иметь возможность объединить это с другими таблицами, которые могут иметь несколько строк для одной карты (и поэтому я бы хотел избежать максимально возможного умножения количества строк на карту)
Учитывая мои ограничения по производительности и размеру (я хочу, чтобы это работало на недорогих мобильных телефонах с базой данных, возможно, на медленной SD-карте),лучше иметь большее количество столбцов, выполнить больше JOIN или выполнить несколько запросов? Есть ли другое решение, о котором я не думал?