带有“其他”选项的下拉菜单

时间:2013-09-08 22:05:58

标签: database-design user-experience

每当我得到一个要求使用“其他(在下面指定)”选项下拉的规范时,我会呻吟,因为它们很难实现。

  1. 将此信息存储在数据库中的最佳方法是什么?是否更好地使用两个字段,一个是不同表中值的整数外键(包括“其他”),第二个字符串字段用于存储“其他”值(如果选择它)?或者只是将所选选项存储为字符串(这也使得将值从数据库中取回更容易)。
  2. 界面方面,如果选择“其他”(可能通过一些jQuery hackery),或者使用某种combox小部件,你会使用常规的旧<select>并弹出一个隐藏的<input type="text"/>吗? this widget的“过滤”版本是我发现的最友好的版本,但实现看起来不太好(2000行,并且它有错误)。

  3. 作为一个例子,假设我有一个名为vehicles的表。它列出了我网站上注册的所有车辆。它包含诸如年份,品牌,型号,里程等内容。

    假设我有另一张表,其中包含用户可以选择的所有品牌:本田,丰田,宝马等。

    但是我的“make”表可能不是最新的,所以如果没有列出,我想允许用户输入自己的。在这种情况下,他们会从下拉列表中选择“其他制作”,然后手动输入制作。

    您如何在vehicles表格中表示这一点?

    一个。作为一个字段,make可能是varchar(255)。即,如果他们选择现有的制作,则只会将其复制到该字段中 湾作为两个字段:make_idmake_other。第一个持有makes表的一个键,第二个只有在选择“其他”时才会填写。


    显示/隐藏“其他”文本框的jQuery解决方案:

    $('select>option').filter(function() {
        return !!$(this).data('other');
    }).each(function() {
        $(this).closest('div.row').next().toggle($(this).is(':selected'));
        $(this).parent().on('change', function() {
            if($(':selected',this).data('other')) {
                $(this).closest('div.row').next().show().find('input').focus();
            } else {
                $(this).closest('div.row').next().hide().find('input').val('');
            }
        });
    });
    

    只需将data-other="1"添加到“其他(请注明)”<option>即可。假设您的输入在<div class="row">中布局 - 修改其他布局。

1 个答案:

答案 0 :(得分:1)

我更喜欢将信息存储在数据库中的第一选择,原因如下:

  • 我最好将所有数据保存在数据库中
  • 大多数时候客户会要求让它变更,实际上他们会要求一些屏幕允许他们更改(添加,删除,更新)这些信息
  • 在系统启动时将大部分(如果不是全部)此信息加载到缓存中是一项简单的任务,因此我无需调用数据库来加载所有数据

对于如何在数据库中存储我更喜欢外来列技术,并且我不会使用第二列存储该值有两个原因

  • 首先,我大部分时间都会在缓存中加载Other表,所以我不担心数据库性能问题
  • 对于客户想要更新Other表值的情况,我不必传递存储值并更改它的所有表。

对于某些情况,我不介意为String表使用Other主键,因此我会直接存储该值并保留Other表以供描述和任何相关信息。因为在大多数情况下,与系统中的核心表(员工,用户,购物车,产品......等)相比,表的大小将非常小。但是我应该保证很少更新字符串值(例如,国家/地区表)。