@newpy
web-dev

Как организовать структуру данных или схему БД для EN-RU словаря с категориями?

Задача казалось бы тривиальная, нечто вроде русско-английского словаря, с категориями. Нужно хранить в БД слова русские [Ruword], английские [Enword]. И слова разделены по категориям [Categories]. Есть указанные сущности(модели). Русские слова могут иметь несколько английских значений, и наоборот. Например "работа" -> (job, work) и наоборот job->(работа, труд, и тп). Связь Many-to-many. И есть категории к которым принадлежат слова (и русские и английские). В свою очередь у одного слова может быть несколько категорий, и у одной категории может быть много слов (Ruword, Enword). Кое-как получилось сделать это с помощью полиморфной связи,

Ruword
    id - integer
    value - string

products
    id - integer
    value - string

Categories
    id - integer
    runame - string
    enname - string
    word_id - integer
    word_type - string


где word_id - ID слова из Ruword или Enword
word_type - строковое значение модели к которому слово относится ('App\Ruword' или 'Enword').

Собственно смущает что в таблице категорий много дублирования самих категорий.
т.е. записи выглядят примерно следующим образом:

Categories
ID     runame           enname    word_id    word_type
1    Путешествия    Travel           4              'App\Ruword'
2    Путешествия    Travel           8              'App\Enword'
3    Путешествия    Travel           5              'App\Enword,
4    Путешествия    Travel           12            'App\Enword'


т.е. хотелось бы чтобы категрии не дублировались а одна категория была уникальной и содержала все слова(id) и Ruword и Enword.

Как можно изменить схему, и как хранить. Кто-нибудь сталкивался с разработкой словариков, мобильных или десктоп приложений словарей иностранных (два языка), или тестов по английскому языку. Подскажите пожалуйста в каком направлении искать организацию и схему БД для таких приложений, как хранить или как можно упростить задачу. По сути требуется слова двух языков, и категории, связи я описал выше. Т.е. везде многие ко многим. Заранее признателен за советы.
  • Вопрос задан
  • 546 просмотров
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Ну так заведите для связки word -> category отдельную таблицу и выкиньте word_id и word_type из Categories
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
В документации описан ваш случай laravel.com/docs/5.1/eloquent-relationships#many-t...
Связь нужно выносить в pivot table, а не хранить с категориями
posts (ваши ruwords)
    id - integer
    name - string

videos (ваши enwords)
    id - integer
    name - string

tags (ваши catogories)
    id - integer
    name - string

taggables (связь слов с категориями)
    tag_id - integer
    taggable_id - integer 
    taggable_type - string
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы