在HSQLDB数据库中存储UUID

Wil*_*iam 8 java uuid hsqldb

我希望将使用java.util.UUID创建的UUID存储在HSQLDB数据库中.

显而易见的选择是简单地将它们存储为字符串(在代码中它们可能只是被视为这样),即varchar(36).

考虑到数据库大小和查询速度等问题,我应该考虑哪些其他选项(由于涉及的数据量很大,这两个问题都不是很重要,但我想至少考虑它们)

del*_*ego 8

你有几个选择:

  • 正如您已经建议的那样,将其存储为VARCHAR(36).这将占用每个UUID 36个字节(288位)的存储空间,而不计算开销.
  • 将每个UUID存储在两个BIGINT列中,一列用于最低有效位,一列用于最高有效位; 使用UUID#getLeastSignificantBits()UUID#getMostSignificantBits()来抓取每个部分并适当地存储它.每个UUID需要128位存储空间,不计算任何开销.
  • 将每个UUID存储为OBJECT; 这将它存储为UUID类的二进制序列化版本.我不知道这占用了多少空间; 我必须运行一个测试来查看Java UUID的默认序列化形式.

每种方法的优点和缺点都是基于你如何在应用程序周围传递UUID - 如果你将它们作为字符串等价物传递它们,那么需要将VARCHAR的存储容量增加一倍的缺点(36)每次进行数据库查询或更新时,不必转换它们可能会超过方法.如果你将它们作为本机UUID传递,那么BIGINT方法的开销可能相当低.

哦,你正考虑考虑速度和存储空间问题,这很好,但是比我说的好多了,你也认识到这些可能并不重要,因为你的应用程序将存储大量数据并保持.与往常一样,为了性能而进行的微优化只有在不这样做会导致不可接受的成本或性能的情况下才是重要的.否则,这两个问题--UUID的存储空间以及在数据库中维护和查询它们所花费的时间 - 由于存储成本低廉以及DB索引使您的生活成为可能,因此其重要性相当低更容易.:)


kar*_*rts 7

  1. 我会建议char(36)而不是varchar(36).不确定hsqldb,但在许多DBMS char中更快一点.

  2. 对于查找,如果DBMS是智能的,那么您可以使用整数值来"接近"您的UUID.

例如,向表中添加一个int列以及char(36).插入表时,将uuid.hashCode()插入int列.然后你的搜索就像这样

WHERE intCol = ? and uuid = ?

正如我所说,如果hsqldb像mysql或sql server一样聪明,它将通过intCol缩小搜索范围,然后只用uuid比较最多几个值.我们使用这个技巧按字符串搜索百万+记录表,它基本上和整数查找一样快.


Luk*_*der 7

HSQLDB具有内置UUID类型。用那个

CREATE TABLE t (
  id UUID PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

  • 使用`PreparedStament``getObject`和`setObject`。这真的很简单。 (2认同)