规范化具有互连 m2m 关系的数据库
Posted
技术标签:
【中文标题】规范化具有互连 m2m 关系的数据库【英文标题】:Normalizing a db with interconnected m2m relations 【发布时间】:2021-11-07 17:11:51 【问题描述】:我有一个问卷调查的商业模式。每份问卷都有多个问题和受访者。所以我的模型看起来像这样:
table questionnaire - id
table respondent - id, name
table question - id, text
table questionnaire_respondent - id, questionnaire_id, respondent_id
table questionnaire_question - id, questionnaire_id, question_id
table respondent_answer - id, questionnaire_respondent_id, questionnaire_question_id, answer_text
模型的问题在于,在respondent_answer
中我有一种数据重复,可以从questionnaire_question_id
和questionnaire_respondent_id
(意思是数据重复)中找出问卷中的数据重复。第二个潜在问题是我们可以插入问题的问卷与受访者问卷不对应的行。我知道我可以使用插入/更新触发器来保护自己。然而,我正在寻找一种在架构层面上确保这一点的方法。
因为当前架构似乎不符合 5 种规范化形式(不确定 5 种中的哪一种)。
如果我没有清楚地说明问题,请告诉我,我会尽力提供一个例子。
问题是如何规范当前的数据库架构?
【问题讨论】:
这与规范化无关。这个词并不意味着“好的设计”。 【参考方案1】:有了这个模型,这两个问题都在架构上得到了解决!
table questionnare_name - id, name
table question_text - id, text
table respondent - id, name
table question - id, questionnare_name (FK), question_text (FK)
table answer - id, respondent (FK), question (FK), text
【讨论】:
【参考方案2】:-- User USR exists.
--
user USR
PK USR
-- Question QUE, worded as QUE_TXT, exists.
--
question QUE, QUE_TXT
PK QUE
AK QUE_TXT
-- Survey (list of questions) SUR exists.
--
survey SUR
PK SUR
-- Survey SUR contains question QUE.
--
survey_question SUR, QUE
PK SUR, QUE
FK1 SUR REFERENCES survey SUR
FK2 QUE REFERENCES question QUE
-- User USR provided answer ANS to question QUE
-- of survey SUR.
--
user_survey_question USR, SUR, QUE, ANS
PK USR, SUR, QUE
FK1 USR REFERENCES user USR
FK2 SUR, QUE REFERENCES
survey_question SUR, QUE
注意:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
【讨论】:
以上是关于规范化具有互连 m2m 关系的数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 M2M 关系在 django 模型中自动填充 IntegerField?