Как представить массив массивов в реляционной базе данных - PullRequest
0 голосов
/ 25 января 2012

Мне нужно спроектировать схему базы данных для следующей проблемы.Рассмотрим этот упрощенный грамматический «анализ» некоторых примеров фразы:

  • «Чрезвычайно некомпетентный таксист»
    1. Extra-₁ ordinari₂ -ly₃
    2. in-₁ компетентный₂
    3. taxi-₁ driv₂ -er₃

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

Я вижу два решения и не знаю, как принять правильное решение.Первое, «грязное» решение : одиночная промежуточная таблица, которая связывает предложения с морфемами и хранит индексы массива.Множество идентичных записей в столбцах.

CREATE TABLE word (           -- pseudo-SQL
  sentence_id FOREIGN KEY,
  sentence_order INTEGER,
  morpheme_id FOREIGN KEY,
  morpheme_order INTEGER );

второе, «чистое» решение : Три (!) Промежуточные таблицы, вероятно, медленные и неудобные в использовании?Обратите внимание, что таблица word обслуживает только идентификаторы для использования двух таблиц внешних ключей.

CREATE TABLE sentence_word (
  sentence_id FOREIGN KEY,
  word_id FOREIGN KEY,
  order INTEGER );
CREATE TABLE word ( id );
CREATE TABLE morpheme_word (
  morpheme_id INTEGER FOREIGN KEY,
  word_id INTEGER FOREIGN KEY
  order INTEGER );

Обычно я бы предпочел чистое решение, но здесь чистое решение имеет неприятный видЭто.Кстати, я пытаюсь сделать это с помощью веб-фреймворка ORM (Django).

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Ваше второе решение является технически правильным. Кладж, который вы чувствуете, на самом деле не из-за проблемы с массивами, а из-за того, что между предложением и словом, а также между морфемой и словом есть много-много взаимосвязей. (Любое данное предложение может состоять из одного или нескольких слов, и любое слово может быть частью одного или нескольких предложений.) Это нормальный кладж, который является (к сожалению?) Побочным эффектом SQL.

Поскольку вы упоминаете django, django пытается абстрагировать вас от этого с помощью полей многие-ко-многим .

Я думаю, что в качестве базовой модели для вашего джанго вы смотрите на что-то вроде этого:

class Sentence(models.Model):
    words = models.ManyToManyField(Words, through=SentenceWord)

class Word(models.Model):
    morphenes = models.ManyToManyField(Morphene, through=MorpheneWord)

class Mophene(models.Model):
    pass


#--- Intermediate Tables ------------
class SentenceWord(models.Model):
    sentence = models.ForeignKey(Sentence)
    word = models.ForeignKey(Word)
    position = models.IntegerField()

class MorpheneWord(models.Model):
    word = models.ForeignKey(Word)
    morphene = models.ForeignKey(Morphene)
    position = models.IntegerField()

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

РЕДАКТИРОВАТЬ: Введенная модель Word.

1 голос
/ 25 января 2012

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

Если вам случится использовать Oracle, вы можете получить свой торт и съесть его, женившись на втором дизайне.за «чистоту» с материализованными представлениями за представление.

0 голосов
/ 29 января 2012

Если мы примем структуру данных, включенную в массив массива значений , существует простое альтернативное решение: clean , эффективное и интуитивно понятный для работы с :

CREATE TABLE Sentence (...);
CREATE TABLE Word     ( sentence_id FOREIGN KEY,
                        order INTEGER );
CREATE TABLE Morpheme ( word_id FOREIGN KEY,
                        order INTEGER );

Это просто отношение 1 к N, дважды.(С помощью ORM в Django вы можете просто сказать word.sentence, чтобы получить доступ к предложению, которому принадлежит экземпляр Word, или sentence.word_set.order_by('order'), чтобы получить упорядоченный набор слов в некотором предложении.)

Недостаток этой схемы состоит в том, что элементы массива, которые встречаются много раз, например -ly в экстраординарно , хранятся много раз в базе данных, по одному для каждого вхождения.Невозможно связать дополнительные данные со всеми -ly морфемами.

...