保留几个组合框(列表框)的最佳表结构是啥
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)
【讨论】:
以上是关于保留几个组合框(列表框)的最佳表结构是啥的主要内容,如果未能解决你的问题,请参考以下文章