【问题标题】:Designing Django models with potentially horizontally growing data columns设计具有潜在水平增长数据列的 Django 模型
【发布时间】:2020-03-29 01:17:48
【问题描述】:

我有许多与某些房地产相关的“功能”。例如,单户住宅可以有 4 间卧室、2 间浴室、1 个游泳池。公寓单元将配备空调和洗衣房等。我不确定如何将这些功能与 Django 模型中的每个属性相关联。我的第一次尝试是让每个属性都用一个唯一的 ID 表示,并创建一个列出所有功能的表?例如

propertyID | A/C | Bedrooms | Bathrooms | Electric Stoves | Pool | Balcony | Gas Stoves
123        | T   | 4        | 2         | F               | T    | T       | T
124        | F   | 1        | 2         | T               | F    | F       | F
...

如您所见,如果我正在处理一个天气寒冷的区域,Pool 很可能是所有F,我选择表示特征的方式可能是很多重复值。我不确定另一种方法来建模我的数据。随着我添加越来越多的功能,例如 wifi、壁炉,该模型将水平增长。它还可能有很多 F 值,用于一些非常不常见的东西(直升机停机坪)

Django 中的示例模型

class Features(model.Models):
  air_conditioning = models.BooleanField()
  electric_stove = models.BooleanField()
  pool = models.BooleanField()
  bathrooms = models.PositiveIntegerField()
  ...
  ...
  ...

【问题讨论】:

  • 我真的没有看到这样做的问题。您能想到的可能的事情...如果空调仅出现在一处房产的某些卧室中怎么办?也许这是不需要的信息,但这在您的设计中是不可能的。在这种情况下,您必须拆分模型,并拥有一个单独的模型“房间”,其中包含“A/C”“类型”等列。此外,一个“房间”有一个外键指向它所属的“属性”。所以一个属性就变成了一个“房间”的容器。
  • 如果它随时间动态增长,我建议您使用 NoSQL DB 之类的 MongoDB,它使您能够克服模型迁移和动态列创建

标签: python django database django-models django-rest-framework


【解决方案1】:

添加越来越多的列的主要问题之一是单个表中的总列数非常有限。例如,在 MySQL 中有一个hard limit,每个表有 4096 列。

另一个问题是每次需要添加新功能时都需要修改数据库和应用程序架构(这意味着您不能拥有用户定义的功能)。

有许多可能的方法。

  1. 如果您只关心列数并且所有这些列都是布尔值,您可以尝试使用每个特征都是一个位的位图。这样,每个 4 字节 INT 就有 32 个特征。尽管您需要一些按位布尔运算来获取/设置特定特征,但这会以直接的方式映射到 ORM。
  2. 如果您想要拥有数千列或想要允许用户定义的功能,您可以考虑使用Entity-Attribute-Value pattern。但是,您需要注意可能的性能损失:如果您希望使用每个特征的列来重建整个对象,则可能必须运行昂贵的查询。 EAV 本身映射到与包含实体模型类的多对一关系的单个模型类
  3. 现代数据库支持 JSON/JSONB 类型,您可以在其中存储几乎任何内容并利用强大的查询。众所周知,PostgreSQL 尤其具有good JSON support。它们也可以在其他主要供应商的 DBMS 中使用。 JSON seems to be supported in Django 也一样
  4. PostgreSQL 特有的:HSTORE column type,它本质上是一个 map/dict,效果很好。

【讨论】:

  • 非常有用的 Synopsys @Dmitry!谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多