2016-08-17 3 views
2

Я создал приложение для двуязычного словаря , и в настоящее время он очень прост, но мы собираемся начать разработку записей более полно, и я пытаюсь найти лучшую структуру базы данных для него. Предыдущие проекты словарей, над которыми я работал, использовали xml (поскольку словарные записи в основном иерархичны), но мне нужно сделать это с помощью базы данных.Лучший дизайн базы данных для иерархической структуры?

Это то, что характерно, запись средней сложности будет выглядеть (немного упрощен):


ДАР
/DAR/

  • существительного
    1. дом, жилые помещения, жилые помещения
      ar-rājl dhul ad-dār: «Человек вошел в дом».
    2. начало
      rjaƷna lid-dār, «Мы вернулись домой».
  • глагол
    1. превратить
      Dur ли-Yamin, "Поверните направо".
    2. оборачиваться/о

Как вы можете видеть, одно слово может иметь несколько частей речи, так что «часть речи» не может быть просто атрибутом Entry, это должно быть связано с чувствами. Каждый pos может иметь множественные чувства (пронумерованные), и, конечно, каждый смысл может иметь несколько близких синонимичных переводов. У чувств могут также быть примерные предложения (возможно, более одного), но не всегда. Думая о том, как части входа связаны друг с другом, я придумал следующую структуру, используя пять таблиц:

Entry 
-id 
-headword 
-pronunciation 
-... 

PartOfSpeech 
-id 
-entry (ForeignKey) 
-pos 

Sense 
-id 
-sense_number 
-part_of_speech (ForeignKey) 
-... 

Translation 
-id 
-tr 
-sense (ForeignKey) 
-... 

Example 
-id 
-ex 
-ex_tr 
-sense (ForeignKey) 
-... 

Или, другими словами:

        _ Translation 
Entry -- PartOfSpeech -- Sense --| 
            - Example 

Это кажется простым и имеет смысл я, но мне интересно, будет ли это слишком сложно в исполнении. Например, чтобы отобразить список записей, мне нужно было бы написать несколько вложенных циклов for (for e in entries → for p in pos → for s in senses → for tr in translations) - и все с обратным просмотром!

И я не думаю, что я мог бы даже отредактировать целую запись в администраторе Django (если только это не позволит вам как-то сделать Inline Inline Inline). Я все равно собираюсь создать интерфейс редактора, но приятно иметь возможность проверять вещи на сайте администратора, когда захотите.

Есть ли лучший способ сделать это? Я чувствую, что должно быть что-то умное, что мне не хватает.

Спасибо, Karen


Если вам интересно: tunisiandictionary.org. В своей простой, текущей форме он имеет только две таблицы (Entry, Sense), причем переводы просто разделяются запятой в одном поле. Что плохо.
По двум причинам: 1) потому что это веб-приложение, которое я написал с Python/Django, и 2), потому что я ненавижу xml.

ответ

-1

Почему бы не использовать структуру данных python dictionary (или json/bson) вместе с mongodb?

В python это гораздо удобнее, чем xml.

Например, вы можете просто иметь список объектов python dict для представления всего словаря. Каждый элемент может быть структурирована следующим образом:

[{ 
    "_id": "1", 
    "word": "étudier", 
    'definitions': { 
     [(
      "v", 
      "to study", 
      "j'étudie français", 
      "I study french" 
     ), ... 
     ] 
    } 
}, ...] 

, где определения представляет собой список кортежей (первый элемент является частью речи, второй элемент является определение, третий элемент является примером в первом языке, четвертый элемент перевод этого примера).

Затем вы можете легко проиндексировать его в базе данных mongodb.

Это очень простая структура, и вам не нужно иметь дело с чрезмерно сложной базой данных с внешними ключами. Использование mongodb, определение определений для слова так же просто, как

record = db.collection.find({'word':'étudier').

+0

Нет, это не сработает, потому что каждая часть записи будет иметь свои собственные атрибуты. (Возможно, я должен был указать, что приведенный выше пример ввода несколько упрощен.) Например, чувства должны иметь номера, а некоторые из них могут иметь предлоги. Каждое слово перевода также может иметь связанные с ним атрибуты (т. Е. «Датированные», «ненормативная лексика»). И, конечно же, мне нужно будет легко найти часть речи, перевода и т. Д. В целом, то, что я пытаюсь сделать, было бы слишком сложным для такой структуры. – larapsodia

+0

Если это слишком ограничено, у вас должен быть полный дизайн базы данных. Вы можете использовать sqlite, который является легким и легким. Пример дизайна: http://www.java2s.com/Code/Android/Database/SearchableDictionary.htm – CentAu

+0

Спасибо, например, но, к сожалению, не hablo java. :-) У меня уже есть база данных (я использую Postgres), но мне просто интересно, является ли эта структура для нее логичной/эффективной. – larapsodia

1

Вы также можете эмулировать спасительные словари в SQL-базах данных. Кто-то написал этот удивительный помощник уже:

Django Dictionary Model

Я использую его в моем проекте.

Смежные вопросы