Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.currentTimeInMillis()作为NoSQL数据库行中的列名(时间排序)_Java_Database_Performance_Database Design_Nosql - Fatal编程技术网

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
    'suggestedId'
    ,该id比上次评论的id大一个(前端会从以前的数据库读取中知道这一点)。此id将与使用System.nanotime()生成的id进行比较。如果
    suggestedId
    小于
    generatedId
    ,则将使用
    generatedId
    ,否则将使用
    suggestedId
    。所以它只是意味着无论什么更大,都要使用这个Id。这保证了单调性
虽然不是真正的完美,但“是”听起来很适合实际使用!
你们愿意分享一下你们的想法吗?谢谢

在许多系统上,
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