【问题标题】:A good way to store this browser versions - Django/Postgresql存储此浏览器版本的好方法 - Django/Postgresql
【发布时间】:2011-05-30 23:50:15
【问题描述】:

我有这些数据:

火狐3.6

有3个项目

  • 姓名
  • 最高版本
  • 最低版本

我是这样存储的:

class MyModel(models.Model):

    browser_name = models.CharField(...)
    browser_max_version = models.IntegerField(...)
    browser_min_version = models.IntegerField(...)

或替代

class Browser(models.Model):

    name = models.CharField(...)
    max_version = models.IntegerField(...)
    min_version = models.IntegerField(...)

class MyModel(models.Model):

    browser = models.ForeignKey(Browser)

有什么聪明的方法可以将值存储在 1 个字段中并同时使其可解析?

我知道这听起来可能很奇怪,但我想知道是否有其他方法可以替代构建 100 万个模型来表示数据。


有什么想法吗? :)

【问题讨论】:

  • 如果你想存储3.6之类的东西,不应该是FloatField吗?
  • @lazerscience: FloatField 不起作用 :) 作为3.11 should be > than 3.6。不过谢谢

标签: python sql django postgresql


【解决方案1】:

您可以使其可解析,但可能不可索引。例如,您可以将用分号(或其他字符)分隔的值连接在一起,然后简单地拆分字符串以取回值。 “Firefox 3.6”将变为“Firefox;3;6”。虽然这更容易解析,但与原始格式相比并没有太多优势。

这种方法的最大警告是该列不能以非常精细的方式进行索引。例如,您不能要求所有版本的 Firefox。 PostgreSQL 允许一些非常高级的索引,我相信这将允许您创建所需的索引,但我不知道您可以通过 Django 的 ORM 访问索引的任何方式。

【讨论】:

    【解决方案2】:

    第二个例子中MyModel的目的是什么?一张桌子Browser 就是您所需要的。为什么你需要“数百万”个模型?还是您在谈论表格中的行?

    class Browser(models.Model):
    
        name = models.CharField(...)
        max_version = models.IntegerField(...)
        min_version = models.IntegerField(...)
    

    没问题

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2020-04-02
      相关资源
      最近更新 更多