我正在尝试设计一个应用程序,它将使用数据库存储有关盒子的一些信息。
这些框位于特定的预定义站点,例如“车库”,“起居室”等。可以使用下拉框轻松选择的位置。但有时他们可能会像“乔”那样的其他地方,几乎是具体的,而且大部分是不可重复的。
所以我的问题是如何将其存储在数据库中? 我的第一个想法是与带有框的表格建立简单的关系
BOXES
| ID_BOX | ID_LOCATION |
| 1 | 1 |
| 2 | 3 |
另一张位置
的表格LOCATION
| ID_LOCATION | LOCATION |
| 1 | Garage |
| 2 | Living Room |
但是我怎么能把额外的选项放在这里?将它们“临时”添加到位置表?或者制作一个“其他”字段并将此信息存储在其他地方?
答案 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 表中的值,并将用户提供的值直接保存到框表中。