Django 如何在关系数据库中表示数组数组

Django 如何在关系数据库中表示数组数组,django,database,database-design,relational-database,Django,Database,Database Design,Relational Database,我需要为以下问题设计一个数据库模式。考虑这个简化的语法“分析”的一些例子短语: “非常不称职的出租车司机” 额外的-₁  普通的₂  -ly₃ 在-₁  有能力的₂ 出租车-₁  驾驶₂  -呃₃ 在这个模型中,一个句子由一系列单词组成,一个单词由一系列单词部分/词素组成。正如我所了解到的,关系数据库对数组的使用不是很满意,这是出了名的 我看到两种解决方案,不确定如何做出正确的决定。第一个“脏”解决方案是:一个单一的中间表,将句子与语素链接起来,并存储数组索引。列中有许多相同的条目 CRE

我需要为以下问题设计一个数据库模式。考虑这个简化的语法“分析”的一些例子短语:

  • “非常不称职的出租车司机”
  • 额外的-₁  普通的₂  -ly₃
  • 在-₁  有能力的₂
  • 出租车-₁  驾驶₂  -呃₃
在这个模型中,一个句子由一系列单词组成,一个单词由一系列单词部分/词素组成。正如我所了解到的,关系数据库对数组的使用不是很满意,这是出了名的

我看到两种解决方案,不确定如何做出正确的决定。第一个“脏”解决方案是:一个单一的中间表,将句子与语素链接起来,并存储数组索引。列中有许多相同的条目

CREATE TABLE word (           -- pseudo-SQL
  sentence_id FOREIGN KEY,
  sentence_order INTEGER,
  morpheme_id FOREIGN KEY,
  morpheme_order INTEGER );
第二种“干净”的解决方案:三个(!)中间桌,使用起来可能慢且不舒服?注意单词表如何只提供两个外键表使用的ID

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 );

我通常更喜欢干净的解决方案,但在这里,干净的解决方案有一种笨拙的感觉。顺便说一句,我正试图用一个web框架ORM(Django)来实现这一点。

在第一个设计中,你将很难执行正确的语素顺序,因此我更喜欢第二个设计。但是,如果性能是一个问题,那么第一种设计可能会让您减少加入


如果您碰巧使用了Oracle,那么您也可以通过将第二种设计与性能设计相结合来实现“干净”的目的。

您将很难在第一种设计中执行正确的语素顺序,因此我更喜欢第二种设计。但是,如果性能是一个问题,那么第一种设计可能会让您减少加入


如果您碰巧使用了Oracle,那么您也可以通过将第二种“清洁”设计与性能设计结合起来,让您的蛋糕变得美味可口。

您的第二种解决方案在技术上是正确的。事实上,你所感觉到的混乱不是由于数组的问题,而是因为句子和单词之间以及语素和单词之间存在多对多的关系。(任何给定的句子都可以是一个或多个单词,任何单词都可以是一个或多个句子的一部分。)这是SQL的一个(不幸的?)副作用

因为您提到了django,django试图用它来为您抽象一些内容

我认为作为django的基本模型,您将看到以下内容:

类句子(models.Model):
words=models.ManyToManyField(words,through=SentenceWord)
类词(models.Model):
Morphene=models.ManyToManyField(Morphene,through=MorpheneWord)
莫芬类(型号.型号):
通过
#---中间表------------
类语句词(models.Model):
句子=模型。外键(句子)
word=模型。外键(word)
position=models.IntegerField()
类MorpheneWord(models.Model):
word=模型。外键(word)
morphene=models.ForeignKey(morphene)
position=models.IntegerField()
诚然,我只是在这里输入了这些模型,但这会让你接近需要的位置


编辑:引入Word模型。

您的第二个解决方案在技术上是正确的。事实上,你所感觉到的混乱不是由于数组的问题,而是因为句子和单词之间以及语素和单词之间存在多对多的关系。(任何给定的句子都可以是一个或多个单词,任何单词都可以是一个或多个句子的一部分。)这是SQL的一个(不幸的?)副作用

因为您提到了django,django试图用它来为您抽象一些内容

我认为作为django的基本模型,您将看到以下内容:

类句子(models.Model):
words=models.ManyToManyField(words,through=SentenceWord)
类词(models.Model):
Morphene=models.ManyToManyField(Morphene,through=MorpheneWord)
莫芬类(型号.型号):
通过
#---中间表------------
类语句词(models.Model):
句子=模型。外键(句子)
word=模型。外键(word)
position=models.IntegerField()
类MorpheneWord(models.Model):
word=模型。外键(word)
morphene=models.ForeignKey(morphene)
position=models.IntegerField()
诚然,我只是在这里输入了这些模型,但这会让你接近需要的位置


编辑:引入Word模型。

如果我们将涉及的数据结构作为数组值数组,则有一个简单的替代解决方案,它是干净的高效的,并且直观的使用

CREATE TABLE Sentence (...);
CREATE TABLE Word     ( sentence_id FOREIGN KEY,
                        order INTEGER );
CREATE TABLE Morpheme ( word_id FOREIGN KEY,
                        order INTEGER );
这只是一个1对N的关系,两次。(使用Django的ORM,您可以简单地说
word.句子
来访问单词实例所属的句子,或者说
句子.word\u set.order\u by('order')
来获取某个句子中的有序单词集。)


此设计的缺点是,多次出现的数组项(如-ly in extroordinary)会多次存储在数据库中,每次出现一次。不可能将附加数据与所有语素关联。

如果我们将涉及的数据结构视为数组值数组,则有一个简单的替代解决方案,它是干净的高效的,并且直观的使用

CREATE TABLE Sentence (...);
CREATE TABLE Word     ( sentence_id FOREIGN KEY,
                        order INTEGER );
CREATE TABLE Morpheme ( word_id FOREIGN KEY,
                        order INTEGER );
这只是一个1对N的关系,两次。(使用Django的ORM,您可以简单地说
word.句子
来访问单词实例所属的句子,或者说
句子.word\u set.order\u by('order')
来获取某个句子中的有序单词集。)

此设计的缺点是数组项