保留几个组合框(列表框)的最佳表结构是啥

Posted

技术标签:

【中文标题】保留几个组合框(列表框)的最佳表结构是啥【英文标题】:what is the best table structure for keeping several combo box(list box)保留几个组合框(列表框)的最佳表结构是什么 【发布时间】:2012-12-07 13:07:18 【问题描述】:

我的 Web 应用程序中有几个列表框需要用户填写。管理员可以从控制面板的组合框中添加/删除/编辑值。所以问题是将这些组合框保存在数据库中的最佳方法是什么。

一种方法是为每个组合框保留每个表格。我认为这很容易处理,但我必须为每个组合/列表框创建 20 多个表。我认为这样做是否是一种好习惯。

另一种方法是为所有组合框保留一个表。但是在这种情况下删除数据时我很担心。 如果我想从组合框表中的国家/地区删除印度,那么我将遇到问题。我可能必须将其更新为 null 或其他方式,并且必须在编程方面进行处理。

我说的对吗?你能帮我吗?

【问题讨论】:

【参考方案1】:

另一种可能性是将组合框数据作为数组或 json 字符串保存在表中的单个字段中,但您是否要这样做取决于您希望表如何运行以及您的应用程序是。请参阅Save php array to mysql? 了解更多信息。

编辑:

我将假设您有一个包含不同国家/地区的组合框,可能还有一个包含职位和其他内容的组合框。

    如果您创建多个表,那么是的,您将不得不使用多个 SQL 查询,但表中的数据量将是灵活的,删除将是一个步骤:

    mysqli_query($link,"DELETE FROM Countries WHERE Name='India'");
    

    使用 json 或数组选项,您可以拥有一个表,并且每个组合框将是一列。这意味着您只需查询表一次即可填充组合框,但随后您必须解码 json 字符串并遍历它们并检查空值,例如,如果国家/地区有 50 个条目但职称只有 20 个. 数据量会有一些限制,因为“文本”类型只有有限的长度。 (有可能,但要管理的代码是一场噩梦)

您可能需要多次查询才能填充这些框,但我觉得第一种方法是最有条理和最灵活的,除非我误解了您的数据库结构需求...

第三种可能的答案,虽然非常不同,但可能是使用 AJAX 从服务器上单独的 .txt 文件中填充组合框,尽管通过手动打开文件并输入或删除它也会很复杂。

【讨论】:

我的应用程序是一个基于 Web 的 HRM 系统。所以有很多列表框要填写。那是有很多列表框可以从控制面板配置。只有管​​理员和其他超级用户才能访问此网站。我想现在很清楚了。 @kiriappa 我认为在这种情况下,我会为每个框创建一个表。 你能解释一下你为什么这么认为吗? @user1876470(抱歉不能在他们的帖子下发表评论(没有足够的代表))这可能是另一种方式。基本上它是 id=autoIncrement (仅用于数据库清洁) name='任何框的条目)和 box='它应该出现在哪个框' 所以如果你有 1/India/1 , 2/Japan/1 , 3/Engineer/2 , 4/Painter/2 , 5/China/1 然后你可以使用"SELECT Name,Box FROM ComboBoxData" 然后使用switch() 来分配适当的值。 我使用这个使用单独表的解决方案,因为我可以轻松查询数据以及数据库模式的未来变化。谢谢大家【参考方案2】:

我认为您应该创建一个包含 3 个字段的表。第一个字段是 id,第二个是名称,最后一个是外键。例如:

combo_box_table id - 名称 - 盒子 1 - 日本 - 1 2 - 印度 - 1 3 - 苏格兰 - 2 4 - 英格兰 - 3

你只需要玩查询,每个框代表最后一个字段。 1 代表组合框 1,2 代表组合框 2,依此类推。 select * from combo_box_table where box = 1

如果你想删除印度,查询只是从 id = 2 的 combo_box_table 中删除

希望对您有帮助

【讨论】:

如果框是外键,引用表在哪里? 不需要参考表。如果你想在组合框 1 中显示菜单,你可以使用我上面提供的查询。 是的,这很好,如果他们询问列表框之间的任何关系,例如当他们选择部门列表框中仅显示可用工作职位的部门时,我会想到唯一的问题。我会问客户这个。现在全靠他了。 :) 谢谢 我认为我们仍然可以处理这个问题,但我必须为此保留标志并使用几个列,但这会使这变得复杂。 你这是什么意思?你能进一步解释一下吗?我真的不明白你的意思。【参考方案3】:

除非您在组合框本身级别有一些额外信息,否则只需一个简单的组合框项目表就足够了:

CREATE TABLE COMBO_BOX_ITEM (
    COMBO_BOX_ID INT,
    VALUE VARCHAR(255),
    PRIMARY KEY (COMBO_BOX_ID, VALUE)
)

获取给定组合框的项目:

SELECT VALUE FROM COMBO_BOX_ITEM WHERE COMBO_BOX_ID = <whatever>

这个查询的好处是它可以通过对主索引的简单范围扫描来满足。事实上,假设你的 DBMS 的查询优化器足够聪明,表堆is not touched完全,你可以通过clustering 表来消除这个“不必要的”堆(如果你的 DBMS 支持聚类)。从物理上讲,您最终会得到一个代表整个表的 B-Tree。

【讨论】:

如果我必须显示所选部门的职位,该怎么办。我知道这不能以上述方式完成。但是有什么解决办法吗? @kiriappa 然后编辑您的问题并包含相关信息。【参考方案4】:

使用单个表 Countries 和另一个用于 Job Descriptions 设置,如下所示:

国家

ID | Name  | JobsOffered | Jobs Available
_________________________________________
1  | India | 1,2,7,6,5   | 5,6
2  | China | 2,7,5,      | 2,7
etc.

职位描述

ID |       Name       | Description
___________________________________
1  | Shoe Maker       | Makes shoes
2  | Computer Analyst | Analyzes computers
3  | Hotdog Cook      | Cooks hotdogs well

然后您可以查询国家/地区的数据库并获取可用(和提供)的职位,然后只需查询职位描述表中的名称并向用户显示哪些职位可用。然后,当一项工作被填满或打开时,您所要做的就是使用新的 jobID 更新 contry 表。

这有帮助吗? (在这种情况下,您需要按照建议为每个组合框创建一个单独的表,并且您有可用作业的引用 ID)

【讨论】:

以上是关于保留几个组合框(列表框)的最佳表结构是啥的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式填充组合框 dojo (1.8) 的最佳方法是啥?

MFC 组合框下拉/下拉列表:仅显示一项

MS 访问组合框

如何在vfp中的选定组合框中填充列表框?

combox是啥

为 javaFx 表视图中的每一行动态填充组合框列表