规范化具有互连 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_idquestionnaire_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?

M2M协议

Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误

具有一对多关系的表的规范化

关系数据理论-第二节:规范化

Django多对多(m2m)与同一模型的关系