1

每次我得到一个要求下拉菜单的规范时,我都会抱怨“其他(在下面指定)”选项,因为它们很难实现。

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

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

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

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

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

一个。作为一个字段,make它可能是一个varchar(255). 即,如果他们选择现有的品牌,它将被简单地复制到该字段中
b。作为两个字段: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">-- modify for other layouts 中。

4

1 回答 1

1

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

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

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

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

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

于 2013-09-08T22:20:05.027 回答