Django DB дизайн, чтобы быстро произносить слова - PullRequest
0 голосов
/ 11 сентября 2010

Мне нужно быстро найти слова для веб-приложения, которое я пишу в Django.Я думал о том, чтобы поместить каждый символ слова в отдельное целое поле, индексированное по позиции.

class Word(models.Model):
    word = models.CharField(max_length=5)
    length = models.IntegerField()

    c0 = models.IntegerField(blank=True, null=True)
    c1 = models.IntegerField(blank=True, null=True)
    c2 = models.IntegerField(blank=True, null=True)
    c3 = models.IntegerField(blank=True, null=True)
    c4 = models.IntegerField(blank=True, null=True)

    mapping = [c0, c1, c2, c3, c4,]

    def save(self):
        self.length = len(self.word)
        for (idx, char) in enumerate(self.word):
            self.mapping[idx] = ord(char)
        models.Model.save(self)

Затем я мог бы сделать запрос, например Word.objects.filter(length=4, mapping[2]=ord('A')), чтобы найти все слова длины четыре, имеющие Aв третьей позиции.

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

Итак, я думаю, что вопросы будут

  1. У вас есть какие-либо предложения по дизайну?
  2. Будет ли mapping[2] работать?
  3. Смогу ли я передать словарь команде фильтра, чтобы иметь переменное число аргументов ключевого слова?

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2010

Будет ли отображение [2] работать?

Нет, не будет.

Смогу ли я передать словарь в команду фильтра, чтобы иметь переменное число аргументов ключевого слова?

Конечно. Например:

conditions = dict(word__startswith = 'A', length = 5)
Word.objects.filter(**conditions)

найдет все Word экземпляры, начинающиеся с A и длиной пять символов.

У вас есть предложения по дизайну?

Мне кажется, это как случай преждевременной оптимизации. Я подозреваю, что для небольших объемов данных вы сможете комбинировать подходящую функцию базы данных с фильтром Django, чтобы получить то, что вам нужно.

Например:

найти все слова длины четыре, которые имеют букву A в третьей позиции.

Вы можете комбинировать фильтр Django с (Postgresql's) strpos.

contains, position = 'A', 3
where = ["strpos(word, '%s') = %s" % (contains, position)]
Word.objects.filter(length = 4, word__contains = contains).extra(where = where)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...