我的Web应用程序中有几个用户必须填写的列表框。管理员可以在控制面板的组合框中添加/删除/编辑值。所以问题是将这些组合框保存在数据库中的最佳方法。
一种方法是为每个组合框保留每个表。我认为这很容易处理,但我必须为每个组合/列表框创建超过20个表。我认为这样做是否是一个好习惯。
另一方面是为所有组合框保留一个表。但在这种情况下删除数据时我很担心。 如果我想从组合框表中删除India coloum中的印度,那么我将遇到问题。我可能不得不将它更新为null或其他一些东西,并且必须在编程方面将其更新。
我是对的。你能救我吗?
答案 0 :(得分:2)
我认为你应该创建一个包含3个字段的表。第一个字段是id,第二个是名称,最后一个是外键。例如:
combo_box_table
id - name - box
1 - 日本 - 1
2 - 印度 - 1
3 - 苏格兰 - 2
4 - 英格兰 - 3
你只需要使用查询,每个框代表最后一个字段。 1表示组合框1和2表示组合框2等。 select * from combo_box_table where box = 1
如果要删除india,查询只是从combo_box_table中删除,其中id = 2
愿这个帮助
答案 1 :(得分:1)
另一种可能性是将组合框数据作为数组或json字符串保存在表中的单个字段中,但是否要执行此操作取决于您希望表的运行方式和应用程序是。有关详细信息,请参阅Save PHP array to MySQL?。
编辑:
我假设你有一个包含不同国家的组合框,可能还有另一个有职位和其他国家的组合框。
如果您创建了多个表,那么您将不得不使用多个SQL查询,但表中的数据量将是灵活的,删除将是一个步骤:
mysqli_query($link,"DELETE FROM Countries WHERE Name='India'");
使用json或array选项,您可以拥有一个表,每个组合框都有一列。这意味着你只需要查询一次表来填充组合框,但是你必须解码json字符串并迭代它们也检查空值,例如,如果国家有50个条目但是职称只有20个由于“文本”类型只有有限的长度,因此数据量会有一些限制。 (可能,但管理的代码噩梦)
您可能需要多次查询才能填充这些框,但我觉得第一种方法是最有条理和最灵活的,除非我错误地解释了您的数据库结构需求......
第三个可能的答案,虽然非常不同,可能是使用AJAX从服务器上的单独.txt文件填充组合框,但是编辑它们并通过除手动打开之外的任何方式删除或添加选项文件并输入或删除它也很复杂。
答案 2 :(得分:1)
除非你在组合框本身的层面上有一些额外的信息,否则只需一个简单的组合框项目表即可:
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。
答案 3 :(得分:0)
使用单个表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)