我正在创建一张桌子,这让我很奇怪.
如果我存储,比如拥有制造商的汽车(fx宝马,奥迪等),如果我将制造商存储为int或varchar,它会对查询速度产生任何影响.
也是
SELECT * FROM table WHERE make = 5 AND ...;
Run Code Online (Sandbox Code Playgroud)
更快/更慢
SELECT * FROM table WHERE make = 'audi' AND ...;
Run Code Online (Sandbox Code Playgroud)
或者速度会或多或少相同?
通常情况下,开发人员将面临解决问题的两种可能方式之间的选择 - 一种是惯用的和可读的,另一种不太直观,但可能表现更好.例如,在基于C语言中,有两种方法可以将数字乘以2:
int SimpleMultiplyBy2(int x)
{
return x * 2;
}
Run Code Online (Sandbox Code Playgroud)
和
int FastMultiplyBy2(int x)
{
return x << 1;
}
Run Code Online (Sandbox Code Playgroud)
第一个版本更容易为技术和非技术读者选择,但第二个版本可能表现更好,因为比特移位比乘法更简单.(现在,让我们假设编译器的优化器不会检测到它并对其进行优化,尽管这也是一个考虑因素).
作为开发人员,最初的尝试会更好吗?
我有一个映射String-> Integer的表.
我不是静态地创建枚举,而是想用数据库中的值填充枚举.这可能吗 ?
所以,而不是静态地删除:
public enum Size { SMALL(0), MEDIUM(1), LARGE(2), SUPERSIZE(3) };
Run Code Online (Sandbox Code Playgroud)
我想动态创建这个枚举,因为数字{0,1,2,3}基本上是随机的(因为它们是由数据库的AUTOINCREMENT列自动生成的).
在我们的应用程序中,一个实体必须由枚举表示:例如类型,类别,状态等等.
通常,代码中存在使用值来决定一个动作或另一个动作的条件或流程,因此必须以某种方式为应用程序"知道"值(即它必须能够引用特定实例)决定而不是引用整体的类).这就是我们使用枚举而不仅仅是常规类的原因.
问题是这些实体还需要作为其他实体的字段存储(或至少引用)在数据库中.我们通常为每个实体创建一个表,能够在这些列中进行参考完整性检查,并且数据在数据库中只具有"含义",而无需参考枚举来找出每个id的含义.
理想情况下,应该从枚举中的数据填充这些实体的数据,但是现在我们在db初始化脚本中重复了这些值.
当使用像Hibernate这样的ORM时,它会变得有点复杂.
我想知道其他人是如何处理这种情况的.
我对枚举和数据库表之间有重复的想法不太满意,但我还没有找到更好的解决方案.
我想将这个c#权限模块移植到java,但是当我无法将数值保存在数据库中然后将其转换为枚举表示时,我很困惑.
在c#中,我创建了一个这样的枚举:
public enum ArticlePermission
{
CanRead = 1,
CanWrite = 2,
CanDelete = 4,
CanMove = 16
}
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个权限集,如:
ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove;
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法将其保存到数据库中
(int)johnsArticlePermission
Run Code Online (Sandbox Code Playgroud)
现在我可以将它作为整数/长整数从数据库中读出来,然后将其转换为:
johnsArticlePermission = (ArticlePermission) dr["articlePermissions"];
Run Code Online (Sandbox Code Playgroud)
我可以检查权限,如:
if(johnsArticlePermission & ArticlePermission.CanRead == ArticlePermission.CanRead)
{
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在java中这样做?根据我的理解,在java中,您可以将枚举转换为数值,然后将其转换回java枚举.
想法?
什么是性能方面的最佳解决方案和"可读性/良好的编码风格"来表示DB层上的(Java)枚举(固定的常量集)关于整数(或一般的任何数字数据类型)与字符串的关系表示.
警告:有些数据库系统直接支持"枚举",但这需要保持数据库枚举定义与业务层实现同步.此外,这种数据类型可能并非在所有数据库系统上都可用,并且语法可能不同=>我正在寻找一种易于管理且易于在所有数据库系统上使用的简单解决方案.(所以我的问题只是解决了Number vs String表示.)
在我看来,常量的Number表示非常有效(例如,仅消耗两个字节作为整数),并且在索引方面很可能非常快,但难以阅读("0"与"1"等). .
字符串表示更具可读性(与"0"和"1"相比,存储"已启用"和"已禁用"),但消耗的存储空间很多,并且在索引方面很可能也较慢.
我的问题是,我是否错过了一些重要方面?您建议在数据库层上使用枚举表示法.
非常感谢你!
我有一些像这样的枚举:
public enum Classification {
UNKNOWN("Unknown"),
DELETION("Deletion"),
DUPLICATION("Duplication"), ....
Run Code Online (Sandbox Code Playgroud)
但是其中一些人有20个成员,所以目前我在代码中用巨大的if/else块处理它们,如下所示:
int classification= rs.getInt("classification");
if (classification == Classification.UNKNOWN.ordinal()) {
variant.setClassification(Classification.UNKNOWN);
} else if (classification == Classification.DELETION.ordinal()) {
variant.setClassification(Classification.DELETION);
Run Code Online (Sandbox Code Playgroud)
(rs来自JDBC tho).
Java是否有更好的方法来处理这些大的if/else块来做我正在做的事情?通过它循环的一些排序?
java ×5
database ×2
enums ×2
performance ×2
sql ×2
constants ×1
enumeration ×1
hashmap ×1
orm ×1
permissions ×1
postgresql ×1
readability ×1
select ×1