Database 数据库设计:a';代码';被其他实体引用的表

Database 数据库设计:a';代码';被其他实体引用的表,database,view,foreign-keys,Database,View,Foreign Keys,作为一个简单的练习,我正在构建一个数据库,它可以托管在任何数据库服务器上,所以我尽量保持标准。基本上,我想做的是一个被其他实体引用的“代码”表。我解释: 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 wh

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

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语法反映这种行为,然后作为第二个选项,使用数据库附加功能,如触发器ecc


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

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

在一些罕见的情况下,这种设计是有意义的。在这种情况下,在主键/外键中包括xcode字段。因此,您的实体将如下所示:

myentity
id - 1
role_xcode
role - admin (foreign key to role)
title_xcode
title - title (foreign key to property)
然后,您可以创建检查约束以强制执行角色和标题


(很抱歉,我不知道它们是否是标准的,它们确实存在于oracle中,而且非常简单,我希望它们也适用于其他rdbms)

我曾经在所有代码都有一个表的系统上工作过,而其他系统的每个代码都有一个表。我当然更喜欢后一种方法

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

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

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

    欢迎!您需要使用4个空格缩进代码,或者使用编辑器中的101010按钮,以正确呈现代码。我已经帮你修好了。