Python Django DB设计,用于快速全局字
我需要快速查找用Django编写的web应用程序的单词。我想把单词的每个字符放在一个自己的整数域中,按位置索引Python Django DB设计,用于快速全局字,python,django,database-design,glob,Python,Django,Database Design,Glob,我需要快速查找用Django编写的web应用程序的单词。我想把单词的每个字符放在一个自己的整数域中,按位置索引 class Word(models.Model): word = models.CharField(max_length=5) length = models.IntegerField() c0 = models.IntegerField(blank=True, null=True) c1 = models.IntegerField(blank=Tru
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(长度=4,映射[2]=ord('A'))
的查询,以查找所有长度为4且第三位有A的单词
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)
我不是很确定设计和一些机制,所以我想在我去尝试实现它之前,我会在这里征求建议。我不能完全确定进行查询的语法
所以,我想问题是
映射[2]
有效吗conditions = dict(word__startswith = 'A', length = 5)
Word.objects.filter(**conditions)
将查找所有以A
开头的Word
实例,长度为五个字符
你对设计有什么建议吗
我觉得这就像是一个过早优化的案例。我认为对于中等容量的数据,您应该能够将适当的数据库功能与Django的过滤器结合起来,以获得所需的内容
例如:
查找所有长度为4且第三位有A的单词
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)
您可以将Django筛选器与(Postgresql)组合使用
你能告诉我更多的细节吗,这些词有多少个,为什么你需要快速查找它们,以及查找的速度有多快?我正在优化一个回溯约束满足程序来生成纵横字谜。现在我有大约42000个独特的单词和短语。除了大写字母外,它们被去除了所有内容,并存储在所有大写字母中。我在我的算法上运行了cProfile,现在我花了大部分时间从字典中获取候选词(我目前在一个单词列表上使用fnmatch——在我开始优化之前,快速而肮脏地查看是否正确)。我做得越快越好。谢谢你的回答!我正在处理大约42000个单词(在不久的将来,我计划有更多的单词),对于后端的调用,我需要做大约600到800个部分字典查找。word_uuStartsWith无法工作,因为我需要能够找到像“?”SH??”等模式(我正在生成纵横字谜,我应该这么说——对不起)。我不知道Postgresql的strpos过滤器。这是否适用于sqlite3或nonrel/appengine?再次感谢
这对sqlite3或nonrel/appengine有效吗?
:很抱歉,我不知道SQLite或nonrel/appengine是否有与strpos
等效的功能。谢谢!我使用了你的建议,即使用字典指定条件!