【问题标题】:Django - How to add an entry in Ascending order in the database efficiently?Django - 如何有效地在数据库中按升序添加条目?
【发布时间】:2017-01-20 17:25:47
【问题描述】:

我正在 Django 中制作一个应用程序,可以管理我的 GRE 单词和每个单词的其他详细信息。所以每当我向它添加一个我学过的新单词时,它应该按字母顺序在数据库中插入这个单词及其详细信息。同样在检索时,我想从数据库中提取特定单词的详细信息。

效率是主要问题。

我应该使用 SQLite 吗?我应该使用文件吗?我应该使用 JSON 对象来存储数据吗? 如果使用文件是最有效的,我应该实现什么数据结构? Django中是否有任何功能可以有效地做到这一点? 每个单词都有 - 意义、句子、图片、词根。我应该如何存储所有这些信息?

如果答案不是 Django 特定的并且谈论算法或数据库类型,那很好。

【问题讨论】:

  • 我的第一个问题是为什么要在插入时保留字母顺序?这意味着您将自动需要修改该插入之后的所有表记录。您可以检索从数据库中排序的结果。对于 django,您可以使用 order_by("field_name")。就术语或算法而言,除非您使用专门的数据结构,否则这种方法很慢。看看用什么样的数据结构来创建数据库索引。
  • 在搜索字段中,当有人键入一些字母时,我希望显示所有以这些字母开头的单词,就像在所有字典中一样。当然我会读到它。
  • 你不应该关心数据库如何存储数据;这完全是它自己的关切。你应该只关心数据是如何返回给你的,你可以通过排序来控制。
  • @DanielRoseman 我有点离题了,你应该知道并关心索引是如何工作的(尽管对于这个用户和应用程序可能不是完全必要的)
  • @The_coder 扩展了答案

标签: django algorithm


【解决方案1】:

我将从数据的角度来回答,因为这与 django 并不完全相关。

从您的问题看来,您对每个“行”都有一个固定的标识符:单词,它是一个字符串,以及一组固定的属性。

我建议使用任何企业级 RDBMS。就 django 而言,python 生态系统中最受欢迎的是 PostgreSQL。

至于排序,只需在单词 name 上创建索引(如果您使用单词作为主键,这将自动为您完成),并在 django 中使用order_by 检索您的记录。

这里有一些关于django field options 的信息(查看primary_key=True

这是order_byorder_by method的信息

请记住,您还可以在模型的 Meta 类中设置排序。

对于您的搜索案例,您必须实现一个能够使用startswith 查询您的数据库的端点。您可以查看示例here

示例模型:

class Word(models.Model):
    word = models.CharField(max_length=255, primary_key=True)
    roots = ...
    picture = ...

关于您的第二个问题:“这很昂贵吗?” 这真的取决于。用 4000 字我会说:NO

您可能希望在客户端中添加延迟以执行查询(例如“如果用户已输入并且 500 毫秒已通过而没有进一步输入”) 如果我要给任何新手开发者 1 条好的建议,那就是不要过早优化

【讨论】:

  • 最多时,我将使用 4000 个单词以及与每个单词相关的大量信息。所以你认为,使用startswith查询单词对我的问题来说已经足够快了。看起来不错,我会读一读。
  • 是的,4000 对 postgres 来说是轻而易举的事
  • 另外,如果我想提高效率,我应该实现像树或树这样的东西来只在特定分支中搜索吗?因为我认为对于自动完成文本编辑,使用startswith,它将在每个键入的字符之后搜索所有单词。现在也不需要订购了,对吧?因为我会查询它并且排序不应该影响查询过程?
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2015-04-11
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多