使用外键字段的最佳实践
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。只需有一列是它的字符串表示形式,并将其用作外键列。
这样做的好处是,当您查看数据库中的数据时 - 状态字表将很容易解释。您无需再进行一次心理查找即可理解数据。
另一个优点是缓存变得更容易。我们只需要缓存实体而不是查询,因为查找总是通过主键。
稍后如果需要,您可以添加另一列作为显示标签。
【讨论】:
干杯,这就是我的意思,我担心如果我每次都查询数据库以获取有效状态值的列表,这会导致不必要的查询。缓存表格听起来像是我需要的,干杯以上是关于使用外键字段的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章