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

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

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

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

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

【问题讨论】:

    标签: database database-design database-schema


    【解决方案1】:

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

    编辑:

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

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

      mysqli_query($link,"DELETE FROM Countries WHERE Name='India'");
      
    2. 使用 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多