我有一张持有该卡的表格,该表格由以下属性描述
数据库:Oracle 11g
他们USER_TABLE
到许多(- <)
CARD
CARD
id NUMBER PK
name VARCHAR
card_number NUMBER
USER_ID NUMBER USER_TABLE FK
表格可能会存储约2000万条记录
在我的应用程序中,用户(from the table USER_TABLE
)能够确定分配给每张卡的订单。
通过查询下载卡片:SELECT * FROM CARD WHERE USER_ID =?
我的想法是解决订单问题:
第一 订单号添加将确定订单的属性。不幸的是,在更改订单后,我必须更新所有用户记录。
第2个增加两个属性PREF NUMBER NEXT NUMBER。我在卡位置变化1的操作中获得一点,但在最坏的情况下,我更新所有用户卡。
我的问题如下:
如何消除表中的堵塞问题?
有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
让您的订购ID成为FLOAT。然后,您可以将值修改为两个预先存在的值之间。
myID myDataID myOrder => myID myDataID myOrder
1 1 1.0 => 1 1 1.0
1 2 2.0 => 1 2 2.0
1 3 3.0 => 1 3 1.5
MyDataID 3现已从第3名变为第2名。而且我没有必要为任何其他记录更新myOrder值。
答案 1 :(得分:1)
大多数排序遵循基于真实表属性的方案 - 主键,创建日期,薪水。出于商业原因,偶尔需要破坏分拣计划。一个典型的例子是网站上的COUNTRY下拉菜单:所有国家都按字母顺序列出,但美国是第一个。这反映了美国客户群的规模和重要性(至少就英语网站而言)。
世界上只有196个国家(嗯,probably),因此对所有国家实施仲裁分拣计划并不是太困难,而不仅仅是美国。但是,您的用户是否真的要为每个约2000万条记录分配首选排序顺序?似乎不太可能。可能他们想要的是一个自动排序顺序,能够覆盖某些首选记录(如美国的国家代码)。
如果是这种情况,您需要的是一列,它是可选的。用户为他们关心的记录分配优先顺序,其他用户默认为(比如)唯一键顺序。像这样:
select * from big_table
order by nvl2(overriding_sort_order, 9999), uniquw_key
/
当然,如果用户想要更改一条记录的overriding_sort_order,他们必须处理上/下的涟漪 - 或者你必须为它们处理它。关键是,只有相对少数的记录受到影响,而不是整个表。
“优惠顺序怎么样?3张信用卡,我订购了 喜欢用。或DVD列表,显示我更喜欢收到的 下一个“。
个人用户的偏好顺序是不同的商业案例。 “三张信用卡”与原始问题中引用的“2000万”记录不同。
所以,让我们来谈谈你的DVD示例。您没有订购整个LoveFilm库存,您正在创建一个表格,用于为每个用户识别和排序非常小的可用DVD子集:类似于:
USER_WISH_LIST
--------------
User_id
DVD_id
Preferred order
每个用户指定的DVD数量可能只有少数,因为排序顺序仅适用于每个用户选择的DVD。因此,如果用户决定他们想要在 Straw Dogs 之前和之后 Helvetica 之后观看蒙娜丽莎微笑,那么重新安装PREFERRED_ORDER列的开销就会增加在 Johnny Mnemonic 之后和 Man on Wire 之前,完全可以管理。