数据库设计:如何实现“其他”选项?

时间:2012-02-04 23:31:51

标签: database-design

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

这些框位于特定的预定义站点,例如“车库”,“起居室”等。可以使用下拉框轻松选择的位置。但有时他们可能会像“乔”那样的其他地方,几乎是具体的,而且大部分是不可重复的。

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

BOXES
| ID_BOX | ID_LOCATION | 
|  1     |      1      |
|  2     |      3      | 

另一张位置

的表格
LOCATION 
| ID_LOCATION |  LOCATION     | 
|      1      |   Garage      |
|      2      |   Living Room |

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

4 个答案:

答案 0 :(得分:2)

我只想让您当前的方案,其中BOXES中的位置代码引用LOCATION中的位置,但这些位置中的一个是“其他”。

然后我会在BOXES调用OTHER-LOCATION中添加另一列,只有当该位置设置为OTHER时,您的应用才会使用该列。

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)。

从这个意义上讲,它就像那些无休止的形式,你必须填写他们给你一个常见选择的列表,其中一个是“其他”,以及只有你选择该选项时填写的框。

答案 1 :(得分:1)

保持简单,是将一个varchar添加到名为OTHER_LOCATION的BOXES表或类似的东西。然后,您可以允许ID_LOCATION为NULL,或者您可以为其他人输入特定的Location行,并让您的应用程序代码将ID_LOCATION设置为该值,并在使用它时需要输入OTHER_LOCATION列。您对该解决方案的看法取决于您对是否要使用空值的感受,以及您希望如何编写联接。我可能建议使用“其他”行,也许是ID_LOCATION'1'。那么你不必担心两个表之间的内连接。

答案 2 :(得分:1)

如果这些位置肯定非常独特,并且在移动或删除对象后不需要持久性,则可以在删除时添加SQL函数以检查某个位置是否有任何对象,如果有non:删除位置。

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

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

答案 3 :(得分:0)

我会在 location tabe中添加额外字段,其中包含位置为公共或私有的信息(您也可以为公共插入用户ID或 NULL )。然后,您可以将新值插入 location 表。

另一种选择是删除foregin密钥并通过 varchar 字段值保持逻辑关系。在用户界面中,您可以显示 location 表中的值,并将用户提供的值直接保存到表中。