我正在考虑订购ID 31012090134
其中第一位3
代表年份的最后一位数,即2013年
接下来的2位10
表示月份,即10月
下一个2位12
表示月份日期
接下来的2位09
表示一天中的小时,即早上9点
其余4位数字只是特定小时内的增量数字。
我使用MySQL作为数据库引擎,但我不确定将其存储到数据库中的完美方式是什么,可以在需要时快速检索它。我不希望客户等待3-4秒等待加载订单跟踪页面,因为系统正忙着从DB中查找特定的订单ID。考虑到mysql中INT
数据类型的大小,我不认为我可以使用它。通过Varchar
搜索似乎不对。 Bigint
是一个看起来不错的选项,但现在肯定了。
我想到的是根据它们代表的值将它分成多个表。但由于我也在同一个表中使用order_creation_time
作为列,我也可以使用它来缩小到特定日期并在最后4位数字上进行选择查询。
你能建议一个好方法吗?或者这个订单号命名模式是否有任何错误?
答案 0 :(得分:2)
如果您真的想要这种方法,那么您可以执行以下操作:
DATETIME
字段来保存日期和小时字段,请记住始终将分钟和秒设置为零。INT
字段存储每日订单ID。然后,为了确保您始终拥有唯一数据,您需要:
UNIQUE
键。喜欢:UNIQUE_KEY(datetimeField, intField)
但这确实意味着您的应用程序必须跟踪获取唯一每日订单ID所需的逻辑。如果您愿意,也可以在MySQL PROCEDUREs
,FUNCTION
或TRIGGER
中完成此操作。
<强>更新强>
我在您的评论中读到,似乎只想向您的用户显示此自定义订单ID,并在应用程序逻辑中使用它。
如果是这种情况,那么最合乎逻辑的选项是:
BIGINT
:优势在于您可以利用索引。VARCHAR
:优势在于您无需担心BIGINT
的大小。答案 1 :(得分:2)
varchar
肯定,这就是原因:
bigint
更适合搜索,在这种情况下,内存使用varchar
对于搜索来说更糟糕,但好处是允许您在将来更改参考策略(即包含一些字母),而无需更改数据库。为未来做好准备总是好的。 对于使用varchar
的搜索性能问题,这不是一个真正的问题,因为你只需要在该列中创建索引,因此MySQL服务器不必迭代通过记录,和每次搜索几乎一样快,就像在一个int 。所以varchar
的缺点得到了解决,专业人士仍在那里。
在创建表之后创建索引只需要这个简单的sql:
ALTER TABLE `orders` ADD INDEX (`order_id`);
有了这个,引擎将创建并维护一个由该字段排序的辅助列表,所以任何搜索都可以在字典中找到一个单词,你不必遍历所有的单词,因为你知道如果存在的话,每个单词都会很好。
<强>更新强>
另外,我会使用额外的DATETIME
列,因此可以通过此列进行与时间相关的搜索。我想你已经有了。
答案 2 :(得分:0)
如果您愿意,可以使用VARCHAR
列,也可以使用BIGINT
。你没有定义“迅速”,但在大多数情况下,这两者都会很快。
BIGINT
的优势是order_id BETWEEN ? AND ?
之类的查询如果在该列上编入索引,则运行速度会更快。
答案 3 :(得分:0)
我认为最好将其存储在varchar
或BIGINT
列中
来自MYSQL DOC
一个大整数。签署的范围是-9223372036854775808到 9223372036854775807.无符号范围是0到18446744073709551615。
答案 4 :(得分:0)
您可以使用BIGINT DataType存储此大小的值。来自MySQL文档
一个大整数。签署的范围是-9223372036854775808到 9223372036854775807.无符号范围是0到18446744073709551615。
从设计的角度来看,答案一如既往,是“取决于”这是否是一个好主意等,您想要如何检索数据等。如果您需要根据创建时间检索数据,那么您应该在数据库中有一列来表示CreateTime。不要依赖于您的订单ID计算日期时间。一旦您拥有大量数据并且需要运行查询,这将无法很好地扩展。