Database design 数据库设计:如何实现;其他";选项

Database design 数据库设计:如何实现;其他";选项,database-design,Database Design,我正在尝试设计一个应用程序,它将使用一个数据库来存储一些关于盒子的信息 这些框位于特定的预定义位置,如“车库”、“起居室”等。可以使用下拉框轻松选择位置。但有时它们可能在其他地方,比如“Joe's”,这将非常具体,并且大部分是不可重复的 所以我的问题是如何将其存储在数据库中? 我的第一个想法是与一个带盒子的桌子建立一个简单的关系 BOXES | ID_BOX | ID_LOCATION | | 1 | 1 | | 2 | 3 |

我正在尝试设计一个应用程序,它将使用一个数据库来存储一些关于盒子的信息

这些框位于特定的预定义位置,如“车库”、“起居室”等。可以使用下拉框轻松选择位置。但有时它们可能在其他地方,比如“Joe's”,这将非常具体,并且大部分是不可重复的

所以我的问题是如何将其存储在数据库中? 我的第一个想法是与一个带盒子的桌子建立一个简单的关系

BOXES
| ID_BOX | ID_LOCATION | 
|  1     |      1      |
|  2     |      3      | 
和另一张有位置的桌子

LOCATION 
| ID_LOCATION |  LOCATION     | 
|      1      |   Garage      |
|      2      |   Living Room |

但是我怎么能把额外的选项放在这里呢?是否将它们“临时”添加到位置表?或者创建一个“Other”字段并将此信息存储在其他地方?

为了简单起见,可以向名为Other_LOCATION或类似内容的Box表中添加一个varchar。然后,您可以允许ID_LOCATION为NULL,也可以为other输入特定的位置行,并让应用程序代码将ID_LOCATION设置为该值,并在使用它时要求输入other_LOCATION列。您对解决方案的看法取决于您对是否要使用null以及如何编写联接的看法。我可能会建议使用“other”行,可能作为ID\u位置“1”。这样,您就不必担心两个表之间的内部联接。

如果这些位置确实非常独特,并且一旦对象被移动或删除,您就不需要持久性,那么您可以在删除时添加SQL函数来检查某个位置是否有对象,如果没有:删除该位置

如果这听起来很危险或不是一个好主意(在大多数情况下,这将是一个坏主意),您可以在框中添加一列来指定位置是在常规位置还是在临时位置,为每个位置创建一个表,并在第4个表中建立关系。这样,您只能将常规位置的寄存器添加到下拉菜单中,并添加“其他”选项以写入临时位置


甚至更好的是,您可以向locations表中添加一列,并指定它们是否为常规,如果不是,则不会在下拉菜单中显示它们。你可以保持你的计划

我只需要您当前的方案,其中
框中的位置代码引用
位置中的位置,但其中一个位置是“其他”

然后在
框中有另一列
调用
其他位置
,只有当位置设置为
其他
时,应用程序才会使用该列

BOXES
| ID_BOX | ID_LOCATION | OTHER_LOCATION         |
|  1     |      1      |  NULL                  |
|  2     |      2      |  NULL                  |
|  3     |      0      |  On the 4:10 from Yuma |

LOCATION 
| ID_LOCATION |  LOCATION     | 
|      0      |   Other       |
|      1      |   Garage      |
|      2      |   Living Room |
可以说这违反了3NF,但我不这么认为。
OTHER_LOCATION
的值仍然取决于键、整个键以及除键以外的任何内容(请帮帮我,Codd)


从这个意义上说,这就像那些你必须填写的冗长表格一样,它们会给你一个常见选择的列表,其中一个是“其他”,并且只有当你选择该选项时才需要填写一个框。

如果位置是公共的或私人的,我会在位置选项卡中添加额外的字段,其中包含信息(您还可以插入用户id或NULL表示公共)。然后您可以将新值插入位置表


另一个选项是删除foregin键,并通过varchar字段值保持逻辑关系。在用户界面中,您显示位置表中的值,并将用户提供的值直接保存到box表中。

有趣的是,在位置表中使用常规位置与固定位置的方法。如果一批已装箱的值去同一个临时地点。