2017-02-06 1 views
1

(моя причина задать этот вопрос основана на начитавшись this answer, что заставило меня пересмотреть свою текущую установку)проектирования базы данных для словаря слов

В настоящее время я занимаюсь разработкой рубина по применению рельсов, в котором есть много языков , каждый из которых имеет словарь базовых слов, прикрепленных к нему, а также список слов, которые сопоставляются с каждым базовым словом. Способ, которым я в настоящее время настроен, есть таблица base_words, которая содержит base_word в виде строки, а также language_id в качестве внешнего ключа. Существует также таблица words, каждая строка которой содержит строку word, а также base_word_id в качестве внешнего ключа. В каждом столбце есть индекс language_id, хотя я почти уверен, что это лишнее из-за языка_ид на base_word, поэтому я планирую снять его (хотя это может быть плохое предположение с моей стороны).

В целом, в отличие от ответа, который я упомянул в начале, таблицы не разделены языком, потому что я рассуждал о том, что я могу просто вывести языковые слова программно, когда придет время. Тем не менее, мое приложение также будет иметь перевод (ы), связанный с каждым базовым словом (как и с ответом, на который я ссылался), и поэтому я сомневаюсь в своей структуре из-за осознания того, что каждый перевод фактически будет base_word в той же таблице, что и само по себе, что означало бы, что перевод фактически будет просто идентификатором другого базового слова в указанной таблице. Это может быть совершенно нормально, или это может быть не так - я понятия не имею (это мой первый проект программирования).

Это нормально? Нужно ли отделять свои базовые слова на отдельные таблицы для каждого языка, или я могу оставить все это в одной таблице?

Другой пример: мне также нужно хранить много фраз для каждого языка вместе с их переводами. Должен ли я иметь одну таблицу, в которой каждая строка имеет соответствующий перевод фразы или одну таблицу, в которой каждая строка содержит только одну фразу и язык_ид или несколько таблиц (по одному для каждого языка)?

Un Saludo, Майкл

ответ

2

Как и в другом случае, вы будете иметь translations таблицу. Нет технической причины, по которой он не может иметь несколько внешних ключей до base_words (a source_word_id и target_word_id, возможно). Так что да, вы можете абсолютно хранить все свои слова в одной таблице. Есть некоторые незначительные побочные эффекты, связанные с тем, что переводы являются направленными отношениями: становится возможным иметь переводы, которые работают только в одном направлении, и будет много пар записей с противоположным источником и целью. Ни одно из них не вызывает большого беспокойства: первое даже потенциально желательно для того, чтобы представлять слова с двойными значениями на одном языке, но не в другом, а во втором - дешево, а индексирование - просто.

Вы правы, что вам не нужно words.language_id, если вы всегда присоединяетесь к base_words, когда вы запрашиваете words, и язык имеет значение. Это, очевидно, меняется, если у вас есть вариант использования, когда имеет смысл оставить base_words, но этот сценарий звучит маловероятно на основе того, что вы описываете.

Что касается фраз: почему они должны обрабатываться иначе, чем base_words?

+0

Мысль, провоцируя, на многих уровнях. Отличный ответ. Что касается того, почему фразы нужно обрабатывать по-разному: я не уверен на 100% этого ответа, но я бы сказал, по той же причине, что слова обрабатываются иначе, чем базовые слова: они отображаются в разное время по разным причинам в приложение и хранится с различной информацией. Не говоря уже о том, что фраза состоит из многих слов (в отличие от базовых слов).Однако ваша логика хороша - это та же логика, которая почти заставила меня хранить слова и базовые слова в одной таблице с помощью is_base_word boolean. – michaelsking1993

+0

Вопрос: когда перевод будет работать только в одну сторону ...? Почти по самому определению перевода это не имеет смысла - если он работает одним способом, он определенно работает по-другому в этом конкретном экземпляре. Возможно, не для каждого сценария этого слова, но для конкретного сценария, в котором был сделан перевод, он должен работать - если я не обманываю себя – michaelsking1993