数据库设计:被其他实体引用的“代码”表

Posted

技术标签:

【中文标题】数据库设计:被其他实体引用的“代码”表【英文标题】:database design: a 'code' table that get referenced by other entities 【发布时间】:2010-01-26 10:03:11 【问题描述】:

我正在构建一个数据库作为一个简单的练习,它可以托管在任何数据库服务器上,所以我尽量保持标准。基本上我想做的是一个被其他实体引用的“代码”表。我解释一下:

xcode
id code
r  role
p property

code
r admin
r staff
p title
....

那么我想有一些像这样的观点:

role (select * from code where xcode='r')
r admin
r staff

property (select * from code where xcode='p')
p title

那么,假设我们有一个实体

myentity
id - 1
role - admin (foreign key to role)
title - title (foreign key to property)

显然我无法为视图创建外键,但这是为了说明我的想法。我如何尽可能使用标准 sql 语法来反映这种行为,然后作为第二种选择,使用数据库附加功能,如 trigger ecc...?

因为如果我告诉 myentity 中的角色和标题是“代码”的外键,而不是视图,没有什么能阻止我在标题字段中插入角色。

【问题讨论】:

欢迎您!您需要将代码缩进 4 个空格,或使用编辑器中的 101010 按钮,以使其正确呈现。我已经为你解决了这个问题。 【参考方案1】:

我曾研究过对所有代码都有一个表的系统,而在其他系统中每个代码只有一个表。我绝对更喜欢后一种方法。

每个代码一个表的优点是:

    外键。正如您已经发现的那样,不可能通过单个表的外键强制遵守允许的值。使用检查约束是一种替代方法,但维护成本较高。 性能。代码查找通常不是性能瓶颈,但如果优化器知道它正在从四行而不是四百行的表中检索记录,它无疑有助于优化器对执行路径做出明智的决定。 代码组。有时我们希望将代码组织成子部分,通常是为了更容易呈现复杂的值列表。如果我们每个代码都有一个表格,我们在结构方面会更加灵活。

此外,我注意到您希望能够“在任何数据库服务器上”进行部署。在这种情况下,避免触发。在大多数情况下,触发器通常是坏消息,但它们具有特定于产品的语法。

【讨论】:

【参考方案2】:

在大多数情况下,您尝试做的是反模式和设计错误。只需创建不同的表而不是视图。

在极少数情况下,这种设计是有意义的。在这种类型中,包括主键/外键中的 xcode 字段。所以你的实体看起来像这样:

myentity
id - 1
role_xcode
role - admin (foreign key to role)
title_xcode
title - title (foreign key to property)

然后您可以创建检查约束来强制执行 role_xcode='r' 和 title_xcode='p'

(对不起,我不知道它们是否是标准的,它们确实存在于 oracle 中并且非常简单,以至于我希望它们也出现在其他 rdbms 上)

【讨论】:

以上是关于数据库设计:被其他实体引用的“代码”表的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer数据库

Android数据库设计——2,面向对象(ORM)操作表:增删改查

Android数据库设计——2,面向对象(ORM)操作表:增删改查

第六章 数据库设计之ER模型

struts2和hibernate 传值问题和实体类设计问题

关于数据库表设计和实体类设计的思考