我正在使用Django一段时间,现在我的“树”和整个数据库都充满了数据(注意:现有数据库),我想知道“每个表一个模型”在这一点上是否真的比“每个选择一个模型”。
我有一张桌子 - objtree。这是我存储所有节点(品牌,类别,标签等)的地方。你可以想象它在我的管理中被大量使用。今天我不得不为另一个表添加另一个外键,但我已经有2个外键。问题是我几乎把所有东西都用在这个模型上,但很少使用外键,更不用说这次使用的第三个了。由于每个表都有20k +(最小)行且很少使用外键,我想知道使用“每个选择一个模型类” - 速度明智是不是更好。
这种方法会影响速度吗?到目前为止它对我来说很好(每桌的模型),但对于如此庞大的数据库来说这不是一种过度杀伤吗?
任何意见都表示赞赏。
此致
编辑:
这是模型。很少需要3个外键,但是就像现在一样,它们都是被选中的,即使我不需要它们(也许有一种简单的方法来指定我在做Model.objects.all()
时不想使用它们中的哪一个)。
所以问题是如果让我们说3个模型会更好,我会分别使用外键。这会影响速度吗?还是坏方法?也许我做错了什么,我不知道。
class Objtree(models.Model):
node_id = models.AutoField(
primary_key = True
)
type_id = models.IntegerField()
parent_id = models.IntegerField()
sort_order = models.IntegerField(
null = True,
blank = True
)
name = models.CharField(
unique = True,
max_length = 255,
blank = True
)
lft = models.IntegerField()
rgt = models.IntegerField()
depth = models.IntegerField()
added_on = models.DateTimeField()
updated_on = models.DateTimeField()
status = models.IntegerField()
point_to = models.IntegerField(
null = True,
blank = True
)
node = models.ForeignKey(
'Objtree_labels',
verbose_name = 'Objtree_labels',
to_field = 'node_id'
)
specs = models.ForeignKey(
'OptionSpecs',
verbose_name = 'OptionSpecs',
db_column = 'node_id',
null = True,
blank = True
)
ct = models.ForeignKey(
'CategoryTemplate',
verbose_name = 'CategoryTemplate',
db_column = 'node_id',
to_field = 'group_id',
null = True,
blank = True
)
答案 0 :(得分:3)
我想知道“每桌一个模型”在这一点上是否真的比“每个选择一个模型”更好。
什么是“每个选择的型号”?听起来你的模特错了。
你正在做什么?这听起来好像你没有正确地完成工作的数据库建模部分。听起来 - 从这个简短的描述 - 就像你在模特身上以随意的方式抛出属性。问题是我几乎把所有东西都用在这个模型上,但很少使用外键,更不用说这次使用的第三个了。
“每桌模型”没有明智的选择。你应该问的问题是“我在建模什么?” “这个现实世界的对象是什么?”并且“这件事的关系数据库描述是什么?”
如果让我们说3个模型会更好,我会分别使用外键吗?
三个模型意味着树结构的三个副本,每个副本只有一个外键。
然而,基本问题仍然存在。
这是什么? 这三个不同的东西? 这三个方面是一回事吗?这些不是技术问题,而是现实问题。不要担心性能问题。对于以高保真度建模现实感到烦恼。
'Objtree_labels','OptionSpecs','CategoryTemplate' - 这些真实世界的物体是什么?标签 - 通常在现实世界中不存在。期权规格可能是有形的。类别模板听起来不像真实的东西。
这会影响速度吗?
从不。一个包含大量外键的表和三个包含一个外键的表在速度上几乎没有区别。当然,除非您经常需要在不同的表之间匹配值,否则单独表中的“连接”将产生一些成本。
但如果这三个值是真正独立的 - 三个不同的东西 - 它们必须在不同的表中,以反映它们是不同类型的事实。