带有“其他”选项的复选框的最佳SQL模式

时间:2018-07-18 16:18:04

标签: sql postgresql

我将拥有一个HTML表单,该表单是预定义复选框的列表,如果您要查找的选项不在复选框中,则可以选择输入“其他”字符串。请注意,您可以选中0或许多复选框。

假设我们正在谈论User选择Institutions,例如“学校”,“学前班”,“日托”等。

将其存储在关系数据库中的最佳方案是什么? (PostgreSQL有什么区别)

我在考虑两个选择:

  1. Userinstitutions表具有一对多关系,在该表中,我插入了他们选择的每个选项,如果没有null,则插入“ other”字符串。

  2. Userinstitutions表具有多对多关系,该表填充有我的默认选择。 User还有一个institutionOther字段,我在其中存储“其他”字符串。

哪个最好?还有什么我应该做的吗?

1 个答案:

答案 0 :(得分:2)

我将考虑第三个选项:User表,Institutions表,UserInstitutionsOther表和UserInstitutions表。结构如下:

Users  
  UserId PK
  (other fields containing user information)

Institutions
  InstitutionId PK
  (string field containing "default" institution description)

UserInstitutions
  UserInstitutionId PK
  UserId FK
  InstitutionId FK

InstitutionsOther
  InstitutionsOtherId PK
  UserId FK
  (string field to contain value)

UserInstitutions是解决用户与机构之间多对多关系的关联实体。 InstitutionsOther包含用户输入“其他”的所有记录。

此结构避免了您的选择具有的一些经济问题。您的第一种选择(如果我正确理解了您的描述)要求将所有机构输入为字符串,以容纳“其他”字符串。与外键ID相比,这需要更多的空间,并且如果想修复机构名称的拼写错误,则会在线下产生问题。第二种选择是一种改进,但是如果您在Institutions表中具有“ other”字段,则该列中的值将大部分为空。此外,只要存在“其他”值,您在“常规”机构的外键列中将具有空值。

使用此结构,您将所有“常规”机构都放在一个表中,在这里您可以根据需要编辑字符串,并轻松添加新机构。如果您有一个“ other”条目,则在UserInstutions中根本没有它的值,而在InstitutionsOther中确实有一个值。所有这些表都正确相关,并且可以限制所有字段以防止出现空值。

关于查询此架构的一点。举例来说,如果要获取所有用户和他们选择的所有机构的列表,则需要在用户与UserInstitutions之间以及用户与InstitutionsOther之间进行LEFT JOIN。如果您执行INNER JOIN,则不会获得未选择至少一个“常规”机构和“其他”机构的任何用户;换句话说,所选的用户记录必须在UserInstitutions和InstitutionsOther中都具有相应的记录。