Java System.currentTimeInMillis()作为NoSQL数据库行中的列名(时间排序)
我想使用长时间戳值(可能由Java System.currentTimeInMillis()作为NoSQL数据库行中的列名(时间排序),java,database,performance,database-design,nosql,Java,Database,Performance,Database Design,Nosql,我想使用长时间戳值(可能由System.currentTimeInMillis()生成)作为数据库中的列名。System.currentTimeInMillis()方法能否保证值始终递增??我看到有人抱怨说,有时速度会变慢 我也愿意接受其他可能对增加列名相当重要的选择。我只想保证唯一性(直到它们在相同的毫秒中下降时,我可以考虑它们…..)和增加序列(可能也可能更小的大小(更少的字节),如果可能的话!)p> 编辑:我有一个NoSQL数据库,其中列名(&因此列)按升序/降序排列在一行中。因此,我希望
System.currentTimeInMillis()
生成)作为数据库中的列名。System.currentTimeInMillis()
方法能否保证值始终递增??我看到有人抱怨说,有时速度会变慢
我也愿意接受其他可能对增加列名相当重要的选择。我只想保证唯一性(直到它们在相同的毫秒中下降时,我可以考虑它们…..)和增加序列(可能也可能更小的大小(更少的字节),如果可能的话!)p>
编辑:我有一个NoSQL数据库,其中列名(&因此列)按升序/降序排列在一行中。因此,我希望生成时间戳作为列名,使我能够按时间对列进行排序
我希望使用时间戳值作为列名将博客文章的评论存储在一行中,以启用按时间排序。我想即使10毫秒是分辨率,我也不会介意,因为在我的应用程序中,有人在同样的1/100秒内对同一篇博文发表评论的可能性非常低
编辑:谢谢大家的评论和建议。真的很有帮助。。我想我已经找到了一个解决方案,可以解决System.currentTimeInMillis()很少出现故障的问题。我可以这样实现:-
- 当用户向帖子添加新评论时,前端会发送一个id
,该id比上次评论的id大一个(前端会从以前的数据库读取中知道这一点)。此id将与使用System.nanotime()生成的id进行比较。如果'suggestedId'
小于suggestedId
,则将使用generatedId
,否则将使用generatedId
。所以它只是意味着无论什么更大,都要使用这个Id。这保证了单调性suggestedId
你们愿意分享一下你们的想法吗?谢谢 在许多系统上,
System.currentTimeMillis()
不能解析低于10毫秒的增量。因此,两个不同的调用可以轻松返回相同的值
我建议您保留一个带有计数器的辅助表,您可以通过增加计数器来给出下一个值
为什么要将此作为列名?这似乎是一种非常奇怪的数据库设计。许多数据库提供了一种将序列号输入列的方法。例如,请看这个-- 我希望使用时间戳值作为列名将博客文章的评论存储在一行中,以启用按时间排序 我不是NoSQL专家,但我认为将注释存储为一行中的列不是一个好主意。为什么不为每条注释添加一行,并附上一个时间戳,以便排序 使用传统的关系数据库,表可能如下所示:
comments
--------
id (PK)
blog_id (FK)
created_on (timestamp)
text
按顺序选择注释将在SQL中:
SELECT * from comments WHERE blog_id = ? ORDER BY created_on
System.currentTimeMillis()的粒度通常在10-20ms左右,但即使它的粒度为1ms,原则上,1ms在计算时间上也是永恒的,根据您所做的工作,两个调用以相同的值结束是非常合理的。然而,我猜想,与人们发表博客评论的频率相比,即使20毫秒也可能不是永恒的
因此,如果两个人在相同的20毫秒(或其他时间)内发表评论,仅按此值排序不会定义相关帖子的顺序。但你是否特别关心这种不太可能的情况。如果您这样做了,那么您需要构建一点额外的逻辑(有一个计数器,用于“此毫秒”发布的消息数)。我个人不会为你的用例费心
据我所知,您还以一种根本愚蠢的方式存储数据。为什么不创建一个“Comments”表,每个Comments一行,一个time列,您可以根据需要对其进行排序。其他评论者已经解决了一般数据库设计问题,但仅在这一点上: System.currentTimeInMillis()方法能否保证值始终递增??我看到有人抱怨说,有时速度会变慢 作为将来的参考,这个词(总是增加值)是单调的。不,
System.currentTimeMillis()
不是单调的。它不仅可以运行得更慢,也可以加速(比如说,如果它运行的系统用于时间校正),还可以任意地向上或向下更改(如果用户或脚本更改系统时间)
System.nanoTime()
不正式保证单调性;然而,Hotspot JVM只有在底层系统支持的情况下才会支持它(现代硬件上的现代Linux内核当然支持)。听起来更好-需要注意的是,一些处理器使用电源管理技术等,这可能会在多核的情况下搞砸。所以这更好,但还不够完美。请在回答答案之前完全考虑我的问题!在NoSQL数据库的情况下,你能不能提供一个理由,为什么你认为在一行中存储注释不是一个好的解决方案?谢谢。正如我所说,我不是NoSQL数据库方面的专家,所以我从传统的关系数据库中汲取经验。一个原因是,如果您想显示,您可能需要阅读整行内容,而不仅仅是您感兴趣的部分,比如说注释20到30。另一个原因可能是对象之间的可比性。如果您想使用多个列,那么可能应该使用相同的名称,但可以使用两个列或包含时间戳和文本的组合结构化列。(如:“comment”:[“1299390767”,“这里有一些文本”])包含时间戳和文本的组合结构化列。
--是的Cassandra列是n