Fag*_*ack 8 sql hibernate jpa java-ee jpa-2.0
我正在使用权限模型,我有一张桌子user_permissions.此表将包含一个或多个具有特定bigint的列.我将使用每个十进制数的位来与某些权限规则进行比较(位位置将是权限规则,值将是规则的条件active或not active).
这种方法的问题在于,当使用诸如bigint之类的数字时,我的位数有限.
在这种情况下,我可以在跨数据库环境中使用的最佳列类型是什么?
这些标签代表了我的目标,因此我们赞赏与这些技术相关的任何其他解决方案.
我当时想用@Lob注释来存储大数据,这是最佳做法吗?
更新:user_permission表以1:1的关系扩展用户,并具有bigint字段,如bin_create,bin_read,bin_update,bin_delete,它将二进制数据保存为十进制数字.
澄清问题:我正在考虑使用按位运算符比较权限.因此,假设我有一个权限值为10(1010)的用户,以及需要13(1101)的操作.所以10&13 == 8(1000) - >用户有一个权限匹配操作所需的权限,所以我可以允许或拒绝(由应用程序规则定义哪个).但是使用这种方法我可以使用有限数量的位(假设我增加了要考虑的权限,因此数字也会增加).最大bigint值是~9223372036854775807,这给了我二进制111111111111111111111111111111111111111111111111111111111111111,每个字段有~60个块和许可可能性.那么在这种情况下我可以使用哪种最好的列类型在跨数据库环境中工作以存储大量的二进制块并且可以在java中使用按位运算符?
如果您想以最佳方式存储数据,则必须指定要优化的目标。
这是 MySQL 的最佳解决方案(通过定义BINARY(32)),您可以在您喜欢的数据库上尝试类似的操作:
@Column(columnDefinition = "BINARY(32)", length = 32, nullable = false)
private byte[] bits;
Run Code Online (Sandbox Code Playgroud)
有时,对于某些 JPA 提供程序和数据库,列定义以Lob. 这不是最好的解决方案,因为读取 aLob是一个外部(非常昂贵)操作。尝试更改提供程序或数据库(如果您使用纯 JPA,则可以尝试)。
用于替换Lobs 的选项例如是数字列(您可以使用例如 64 位宽度的 4 列或类似的列)。如果您想要一个好的解决方案,这些容器列甚至可以@Embedded放入您的主类中。但这一切都取决于您的数据库。
这样,您将拥有 256 位(32 字节),无需任何转换和进一步计算,并且如果需要,您还可以扩展范围。不过,更改列定义时必须小心。