如何保存有关订单的数据库信息?

时间:2011-08-17 13:03:01

标签: sql oracle database-design

我有一张持有该卡的表格,该表格由以下属性描述

数据库: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的操作中获得一点,但在最坏的情况下,我更新所有用户卡。

我的问题如下:

如何消除表中的堵塞问题?

有没有更好的方法来解决这个问题?

2 个答案:

答案 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 之前,完全可以管理。