使用外键字段的最佳实践

Posted

技术标签:

【中文标题】使用外键字段的最佳实践【英文标题】:Best practice for working with Foreign key fields 【发布时间】:2012-09-03 02:06:19 【问题描述】:

我有 2 个表格,Word 和 State, State 包含 2 个 cols,ID 和 CurrentState,它的 3 个静态行是 1-Active,2-InActive,3-Other Word 是我要添加行的表。它有 4 个列,ID、Value、Description 和 CurrentState。 它在 currentState 列上具有 State 的外键 这是我的工作代码,它创建了一个 Word,将其设置为 currentState 字段并将其持久化。

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = new State(1,"Active");
word.setState(state);   
worddao.saveOrUpdate(word);

问题是这看起来不太对劲。创建 State 实例的最佳做法是什么,以便我可以创建一个指向有效 State 行的 Word。枚举是这里的一个选项吗?我的意思是我可能会意外地创建一个 ID = 5 的 State 并违反外键约束。我想首先防止这种情况发生。有什么想法吗?

【问题讨论】:

是的,枚举是一种选择!看到这个***.com/questions/417062/enumerations-in-hibernate 枚举是不错的选择 - 但添加新值需要更多努力。如果已经有不同值的条件代码,那不是问题。 【参考方案1】:

执行此操作的安全方法是查找状态对象,而不是创建新对象。您可以将实体标记为可缓存,也可以将检索状态的查询标记为可缓存以避免不必要的查询。

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = stateDao.findByState("Active")
word.setState(state);   
worddao.saveOrUpdate(word);

主/参考数据表的另一个选项(我通常遵循)是没有数字 ID。只需有一列是它的字符串表示形式,并将其用作外键列。

这样做的好处是,当您查看数据库中的数据时 - 状态字表将很容易解释。您无需再进行一次心理查找即可理解数据。

另一个优点是缓存变得更容易。我们只需要缓存实体而不是查询,因为查找总是通过主键。

稍后如果需要,您可以添加另一列作为显示标签。

【讨论】:

干杯,这就是我的意思,我担心如果我每次都查询数据库以获取有效状态值的列表,这会导致不必要的查询。缓存表格听起来像是我需要的,干杯

以上是关于使用外键字段的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

关于覆盖外键表单小部件以接收用户输入的 Django 最佳实践

最佳用户角色权限数据库设计实践? [关闭]

最佳用户角色权限数据库设计实践? [关闭]

关系数据库:当前数据与历史数据,最佳实践

Perl 最佳实践(节选) --- 08

Jira字段配置最佳实践