【发布时间】:2016-06-20 07:54:25
【问题描述】:
我正在尝试自己直接从对数据库模式进行编码的背景中学习 Django。我想了解我应该如何有效地使用数据库抽象工具进行规范化。
作为一个人为的例子,假设我有一个可以就 3 个主题提出问题的对话,每个问题都足够复杂,足以保证有自己的类。
Class Conversation(models.Model):
partner = models.CharField()
Class Weather_q(models.Model):
#stuff
Class Health_q(models.Model):
#stuff
Class Family_q(models.Model):
#stuff
假设我想要进行 2 次对话:
- 与 Bob 的对话 1:问两个不同的天气问题和一个关于他的健康的问题
- 与 Alice 的对话 2:询问天气和她的家人
通常,我会为此编写一个规范化表:
INSERT INTO Conversation (partner) values ("Bob", "Alice"); --primary keys = 1 and 2
INSERT INTO NormalizationTable (fk_Conversation, fk_Weather_q, fk_Health_q, fk_Family_q) VALUES
(1,1,0,0), -- Bob weather#1
(1,2,0,0), -- Bob weather#2
(1,0,1,0), -- Bob health#1
(2,1,0,0), -- Alice weather#1
(2,0,0,1); -- Alice family#1
我是否需要显式创建此规范化表,还是不鼓励这样做?
Class NormalizationTable(models.Model):
fk_Conversation = models.ForeignKey(Conversation)
fk_Weather_q = models.ForeignKey(Weather)
fk_Health_q = models.ForeignKey(Health)
fk_Family_q = models.ForeignKey(Family)
然后我想执行对话。我写了一个这样的视图(跳过异常捕获和逻辑来遍历每个对话的多个问题):
from myapp.models import Conversation, Weather_q, Health_q, Family_q
def converse(request):
#get this conversation's pk
#assuming "mypartner" is provided by the URL dispatcher
conversation = Conversation.objects.filter(partner=mypartner)[0]
#get the relevant row of the NormalizationTable
questions = NormalizationTable.objects.filter(fk_Conversation=conversation)[0]
for question in questions:
if question.fk_Weather_q:
return render("weather.html", Weather_q.objects.filter(pk=fk_Weather_q)[0])
if question.fk_Health_q:
return render("health.html", Health_q.objects.filter(pk=fk_Health_q)[0])
if question.fk_Family_q:
return render("family.html", Family_q.objects.filter(pk=fk_Family_q)[0])
从整体上考虑,这是解决此类规范化问题(与容器对象关联的 N 个对象)的“Django”方式吗?我可以更好地利用 Django 的内置 ORM 或其他工具吗?
【问题讨论】:
-
“规范化表”是众所周知的东西吗?我显然知道数据库规范化,但这并不能帮助我理解“规范化表”是什么。谷歌没有帮助(似乎没有用“规范化表”作为术语的实际结果)。你能定义什么是“规范化表”吗?
-
不要使用没有意义的“人为的例子”。想出一个可以理解的更好的例子,但即使这样,答案也可能是“编写你的 models.py,这样代码才有意义,不要担心规范化。”
-
@Ludwik Trammer 我只是使用该术语来描述具有标准化数据的表。人们通常给它们起对它们中包含的数据有意义的名称。我可能也应该这样做。
-
@LegoStormtroopr,这个例子实际上比你想象的更真实。请参阅我对凯文克里斯托弗亨利的回答的评论。
标签: python django orm normalization