我正在创建一个数据库表,用于存储最终会显示在网页上的菜单链接。
我的问题是我想控制菜单项的顺序。我可以有一个叫做订单的字段,但每次我有一个新的菜单链接我都必须插入订单并将所有更高顺序的记录更改为+1。
例如,假设我想要链接(按此顺序):
Home About Products Shopping
我可以有一个名为 MenuLinks 的表格,其中包含以下列:名称,订单
我的数据看起来像这样:
Name Order Home 1 About 2 Products 3 Shopping 4
但是,如果我现在要添加一个名为 ContactUs 的新链接,但我想在家中显示。
任何人都可以想到一种更好的方法来存储需要在数据库表中排序的列表,而无需这种繁琐的维护工作。
答案 0 :(得分:6)
我觉得这与使用数组与链表的一般问题有关。 如何在同一个表中存储引用下一条记录的外键?这是链接列表,就像方法一样。
对于您的示例,没有太多选项卡,因此基于数组的方法应该可以正常工作。 但对于拥有数百条记录的人来说,使用自引用外键可能很有用。
ID Name NExT
1 Home 2
2 About 3
3 Products 4
4 Shopping NULL
添加和删除行将类似于链接列表的插入和删除。
更新: 修改表
ID Name NExT
1 Home 5
2 About 3
3 Products 4
4 Shopping NULL
5 Contact us 2
订单将是1> 5> 2> 3> 4由下一栏确定。 您还可以使用prev列,使其类似于双向链表。
答案 1 :(得分:5)
如果没有ORDER BY,您无法保证数据的顺序 - 通常,如果没有ORDER BY,它将基于广告订单。
可悲的是,没有适用于用户可自定义排序顺序的约定 人们可以使用像ROW_NUMBER这样的分析/窗口/排名函数,但它依赖于数据和数据库支持(MySQL不支持分析函数,Oracle 9i + / PostgreSQL 8.4 + / SQL Server 2005+)。但是,如果您希望以“B”开头的条目出现在“A”/ etc之前,则分析函数无效。
您的选择是使用两个语句来插入单个记录:
UPDATE YOUR_TABLE
SET sort_order = sort_order + 1
WHERE sort_order >= 2
INSERT INTO YOUR_TABLE
(value, sort_order)
VALUES('new value', 2)
...或删除现有记录,然后按新订单重新插入列表。
答案 2 :(得分:3)
您应该考虑当您使用链接列表时,当您想要重新排序其中一个项目时,您还必须更新其他记录,这需要在一个根本不快的交易中完成。(您需要交易,因为所有更新必须完全完成,或者不得更新任何更新) 此问题的另一种解决方案适用于小列表 要使用此方法,您需要为每条记录提供一个数字。例如:
Name Number
Home 5
About 10
Products 15
shopping 20
具有较小Number的行位于列表的begignig处,具有最大编号的行将是列表的最后一项 现在这就是诀窍,如果你想重新排序产品行并将其插入主页和关于之间,你只需要做的就是将产品的数字字段更改为主页和关于数字之间的数字< 首页数字为5,关于数字为10,因此产品的数字字段为(5 + 10)/ 2 = 7.5 < / p>
Name Number
Home 5
About 10
Products 7.5
shopping 20
现在您可以根据数字字段
对最终列表进行排序答案 3 :(得分:0)
一个更好的解决方案是按顺序创建元素ID的数组,然后将其转换为json数组,并将其按原样存储到文件或表中或任何需要的位置。然后,您可以从数据库中获取对象,并将数组映射回元素列表。您一方面保留顺序,另一方面保留数据。如果从数据库中删除元素,则可以从数组中删除映射为空的元素。如果将新元素添加到数据库中,则还需要将它们也添加到数组中,但是如果没有添加,则没有任何损坏。
长话短说:
1。将订单作为ID的json数组保存到文件或表中,或保存在任何位置。
2。将元素保存在数据库中,而不必担心它们的顺序。
3。在需要时,获取ID数组并将其映射到数据库中的相应元素。
答案 4 :(得分:0)
您可以添加 2 列(之后,之前) 例如联系我们是在家之后和之前,如果您想在联系我们和家之间添加一个新链接,您只需要更改3条记录。 列更改为(新链接名称)之前的主页, 然后您插入新链接,然后在列更改为(新链接名称)后联系我们。 抱歉我英语不好。