| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Проектирование базы данных |
| Автор: FiMa1 4.1.2010, 20:19 |
| Ребята, привет всем! Нужен ваш совет и помощь. Необходимо спроектировать базу данных mysql для словаря. Схема базы получается пока совершенно небольшой, но, так как нет опыта, сомнения в правильности проектирования не дают продвинуться дальше Итак, на простом примере базы данных словаря (отношение один ко многим): ![]() Вопросы: 1. Как физически (на примере mysql) связать между собой две приведенные выше сущности? 2. Какую СУБД выбрать (MyISAM или InnoDB)? 3. Какие потенциальные проблемы вы можете спрогнозировать для такой БД на будущее (с ростом размеров БД и пр.)? 4. Какую доходчивую литературу для нубов почитать на тему проектирования и оптимизации баз данных? Полагаю, ответить на вопросы для знатоков дела сложности не составит, а я был бы очень признателен за помощь. Заранее спасибо! |
| Автор: FiMa1 5.1.2010, 00:41 |
| Похоже вопросы 1 и 2 сняты, кажется, наконец-то нашел толковое описание http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html (InnoDB не поддерживает мой хостер). Все еще интересуют ответы на вопросы 3 и 4... |
| Автор: LSD 5.1.2010, 17:10 |
| Для начала, было бы неплохо объяснить, что за сущности Term и Dict. Мне например это не очевидно. |
| Автор: Kesh 14.1.2010, 23:50 |
| Я бы не стал хранить русский и английский вариант в одной строке таблицы... Для одного слова на русском могут существовать несколько эквивалентов на английском. Как собственно и наоборот... |
| Автор: Deniz 15.1.2010, 06:46 |
| FiMa1, объясни поподробнее. Если я правильно понял, то поддерживаю Kesh, и такой же вопрос про синонимы и антонимы (к одному слову может быть несколько синонимов/антонимов) |
| Автор: FiMa1 15.1.2010, 11:04 | ||||||||||||
Ребята, спасибо за участие!
А как правильно поступить? Для случая, когда одно слово имеет несколько вариантов перевода, пример приведен ниже - Вид содержимого таблицы "Cловарь1".
Для синонимов и антонимов решил создать отдельные таблицы, чтобы в основной таблице словаря не дублировать для одного и того же термина синонимы и антонимы. Потом, при поступлении запроса на перевод слова, например "dog", искать по таблицам синонимы и антонимы все совпадения для данного термина. Но не уверен наиболее ли это оптимальный вариант... Структура таблицы "Список словарей в направлении En-Ru-En" (для каждого списка словарей по направлениям перевода создается отдельная таблица)
Вид содержимого таблицы "Список словарей в направлении En-Ru-En"
Структура таблицы "Словарь1" (для каждого словаря создается отдельная таблица)
Вид содержимого таблицы "Cловарь1"
|
| Автор: Kesh 15.1.2010, 11:33 |
Две (если есть поле язык) или три (для каждого сзыка своя) таблички, одна из табличек служит для связки слов. например Таблица 1. 1 - rus - собака 2 - eng - dog 3 - rus - пес Таблица 2. re - 1 - 2 re - 3 - 2 er - 2 - 1 er - 2 - 3 re - rus -> eng er - eng -> rus |
| Автор: FiMa1 15.1.2010, 11:37 | ||
А мой приведенный выше вариант в одной строке термин-перевод в чем проигрывает? |
| Автор: Kesh 15.1.2010, 11:43 |
| 1. Как вы расширять французским будете? В моем варианте - новые записи, в вашем - изменение структуры таблиц. 2. А если вас надо добавить связки синонимов. в Моем случае Таблица 2. записи syn - 1 - 3 syn - 3 - 1 в вашем - изменение структуры бд 3. Ну и по размеру данных |
| Автор: FiMa1 15.1.2010, 11:57 | ||||||
Нее, без изменения структуры. Как описано выше, при добавлении нового направления перевода (напр. Fr-Ru-Fr) происходит:
Изменения структуры также не предполагается. Поиск перевода термина:
Пока не вижу из-за чего должна сильнее распухнуть база по сравнению с вашим предложением. Единственное только, слово "dog", в моем случае, будет присутствовать и в таблице словаря и в таблицах синонимы и антонимы, это да, согласен. Единственное, но очень весомое преимущество, которое я вижу для вашего предложения по сравнению с моим - это то, что в вашем случае соответствия термин-синоним, термин-антоним заданы численными id, по которым, насколько я знаю, поиск в базе будет осуществлен быстрее, чем поиск по id термина, представленному в текстовом виде. Хотя уверенности по всем пунктам, приведенным мной нет абсолютно |
| Автор: FiMa1 15.1.2010, 12:55 | ||
Ага, это я понял, спасибо! |
| Автор: Kesh 15.1.2010, 16:39 | ||
Уже изменение структуры данных... А для работы с табличкой надо будет еще и програму подправить, чтобы она могла из этой новой таблицы читать. Теперь смотрите, если у вас слово dog будет переводится на английский и французский, то у вас это слово будет сидеть во всех словарях (англо-русском и франко-русском), тут вставет проблема с тем, чтобы правильно занести дополнительную информацию даже к русскому слову. Что если в одном словаре одно описание, в другом - другое. Это уже некорректность в основных данных. теперь синонимы антонимы... Создавая дополнительную таблицу вы потихоньку приближаетесь к тому, что предложил я. Взгляните на это с точки зрения сущностей. Слово у вас это одна сущьность. Язык на котором оно написано, его класс и т.п. - это его свойства. Логично все сущности хранить в одно таблице. (table1) Перевод слова, его синонимы и антонимы - по сути это связи меду словами (сущностями) - принимаем связь за сущность (в ее тип: перевод, синонимия и т.п. за свойство) и вот у нас вторая табличка со связями. (table2) Словари - тоже сущьности, которые характеризуются направлением перевода и содержат в себе набор сущьностей в виде слов и их переводов. Т.е. отдельная табличка для словарей (table3) и табличка включения слова в словарь (table4) (т.к. в одинаковых словарях могут быть одни и те же слова). Возможно также подключение связей слов в переводе (table2) к словарям(table3), если например вы хотите объявить, что в словаре содержатся не все возможные переводы слова, а только тематические. (table5) |
| Автор: FiMa1 15.1.2010, 16:44 | ||
Как только переварю и переосмыслю, составлю новый вариант таблиц и напишу чтобы показать, что получилось. Спасибо! |
| Автор: FiMa1 16.1.2010, 00:52 | ||||||||
| Думал, смотрел, появились вопросы: ВОПРОС 1
А почему только запись в таблице 2 "Связи между словами (сущностями)"? А как насчет случая, если для слова "собака" нужно вести синоним "пёс", а "пса" в таблице 1 "Термины" еще нет по факту? Как построить такую связь? Похоже, что syn - кандидат на добавление в таблицу 1 "Термины" в качестве "языка" (наравне с русским, английским и пр.). Тогда получим в таблице 1 запись:
А в таблице 2 в соответствие имеем:
Хотя это уже, по-моему, бред, но вот такой вопрос возник ВОПРОС 2
Эту фразу, честно, просто не понял. Можно чуть поподробнее, что имелось в виду, что значит "только тематические". Очень интересно. Ну и, наконец, результаты моего творчества. Ребята, посмотрите, пожалуйста. ЯЗЫКИ 1 – русский 2 – английский 3 – французский … ЧАСТИ РЕЧИ 1 – прилагательное 2 – наречие 3 – союз 4 – междометие 5 – числительное 6 – частица 7 – предлог 8 – существительное 9 – глагол 10 – порядковое числительное 11 – местоименное прилагательное 12 – местоименное наречие 13 – местоименное существительное … ![]() НАПРАВЛЕНИЯ ПЕРЕВОДА 1 – русско-английский 2 – русско-французский 3 – англо-французский 4 – англо-русский … ![]() ![]() В принципе уже видно, что Направление перевода дублируется, присутствует и в таблице TermsRelations и в таблице Dicts. Надо бы, видимо, откуда-то удалить (скорее всего из Dicts). |
| Автор: Kesh 16.1.2010, 03:42 | ||||||
Я бы не стал так делать... Если есть у пес синоним слова собака, значит пес - тоже слово и тоже должно быть в списке слов... Другое дело, что это слово может не иметь перевода...
Я бы может быть даже и наоборот сделал. В итоге при поиске перевода я бы сначала делал выборку по активным словарям (подходящим под направление перевода), а потом с номерами словарей поиск по переводам.Хотя предложенный вами вариант искал бы скорее всего быстрее. В итоге я бы сказал очень и очень неплохо... На мой взгляд остается открытым маленький вопрос по поводу того, как быть если у вас два словаря для перевода en->ru и в обоих есть перевод dog->собака... Но с такими "дубликатами" можно смириться... |
| Автор: Kesh 16.1.2010, 13:35 |
| Вот тут есть еще готовый примерчик. http://www.databaseanswers.org/data_models/dictionaries_for_foreign_languages/index.htm |
| Автор: FiMa1 16.1.2010, 20:10 | ||||||
Да, речь как раз о случае, когда "пёс" не имеет перевода. Тогда, при поиске перевода для термина "пёс" я буду вынужден определять, а есть ли для этого слова перевод, т.к. выдать только синоним для термина было бы нелогичным по самому назначению словаря. Такие дополнительные проверки (а есть ли перевод, а не только синоним) снизят производительность. Таким образом, проще, наверное, при добавлении синонима проверять присутствуют ли оба слова в словаре. Неудобно, но зато соответствует основному предназначению сервиса... Кстати, вариант по ссылке, приведенной вами как раз подразумевает обязательное наличие обоих слов образующих синонимичную пару на этапе добавления новой связки для синонимов.
Мой вариант, видимо, будет быстрее при типичном варианте работы со словарем: задан термин, поиск перевода с попутным определением словаря в которой данная пара термин-перевод находится. Но вот если сделать поиск настраиваемым для пользователя (расстановка приоритетов для поиска по словарям и т.п.), то как раз более выигрышным получается ваш вариант. Но это уже вопрос о проблеме выбора: скорость против объема базы, т.к. можно оставить и последний вариант, где колонка "Направление перевода" присутствует и в таблице Dicts и в таблице TermsRelations, а дальше уже уточнять поиск согласно настройкам пользователя. Но вот здесь уже дублирования как-то не хочется, да еще и обработка усложняется.
Да, похоже нужно смириться. Тем более, что это не полные дубликаты по строке, поле dict_id будет отличаться Пример по ссылке тоже посмотрел, спасибо! Во многом напоминает наш вариант |