Таблица с 2 полями с разными типами данных, только одно из них предназначено для объединения, это хорошее решение? - PullRequest
1 голос
/ 28 июня 2019

Я проектирую простую словарную базу данных с реляционной базой данных. Существует одна таблица для хранения всех английских слов с именами WordEn, с целочисленным идентификатором в качестве первичного ключа . Затем есть еще одна таблица с именем ExplanationEn, в которой хранятся пояснения всех английских слов на разных языках, например, английский. Китайский, японский и т. Д. В моем первом плане таблица ExplanationEn содержит следующие столбцы:

  • wordId - внешний ключ, ссылающийся на первичный ключ WordEn
  • language - на каком языке это объяснение
  • explanation - объяснение на данном языке (со строкой - varchar тип данных)

Соотношение между WordEn и ExplanationEn равно один-ко-многим , поскольку слово может определенно иметь много значений

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

  1. сохранить структуру таблицы ExplanationEn без изменений, тогда, когда ExplanationEn join WordCh, условие может привести объяснение к целому числу и сравните с WordCh.id Стоимость приведения будет на каждой записи ExplanationEn таблицы

  2. добавить новое поле, например, называется counterPartId, как внешний ключ от WordCh до ExplanationEn. В результате каждая запись ExplanationEn будет содержать либо пустое поле WordCh, либо ExplanationEn, что означает невозможность заполнения обоих полей значениями. По сравнению с первым решением, теперь оно имеет стоимость приведение строкового значения к целому числу, но вместо этого добавляется дополнительное поле

Вопрос: Какое из этих двух решений лучше или есть какое-то другое решение?

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Я бы работал с 3 таблицами:
Слова (слово, идентификатор слова, язык)
Значения (идентификатор слова, значение, значение идентификатора)
Translatesv1 (fromMeaningId, toMeaningId) - таблица самостоятельного объединения
или
Translatesv2 (groupId, senseId) - таблица самостоятельного объединения

Количество элементов:
1Слово на одном языке может иметь несколько значений
Значения нуждаются в таблице самосоединения.

Идея состоит в том, чтобы самостоятельно объединять значения, а не между словами, и обобщать, чтобы вам не приходилось менятьструктура БД каждый раз, когда вы добавляете новый язык.
Translatev1 имеет недостаток, заключающийся в том, что он имеет подразумеваемое направление «от ... до».
Транластев2 немного сложнее в реализации, но более гибок и работает в любомнаправление.

0 голосов
/ 28 июня 2019

Предполагая, что каждое английское слово имеет только одно объяснение на другом языке, и что может иметь не более другого соответствующего слова на этом языке, я думаю, что хорошим решением может быть добавление нового поля к ExplanationEx таблица, которая содержит соответствующее слово на языке, на котором дано объяснение. Это новое поле (например, translation) может иметь нулевое значение.

С этим решением вы можете сократить количество объединений, используемых для получения необходимой информации.

...