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按钮,以正确呈现代码。我已经帮你修好了。