我不时地思考这个问题,所以我想我会问你们这个问题.
假设我有一个如下所示的数据库表:
Table: Visibility
Id Value
-- -----
0 Visible
1 Invisible
2 Collapsed
Run Code Online (Sandbox Code Playgroud)
这只是确保参照完整性的表格.它基本上是存储在数据库中的枚举,用于确保出现在其他表中的任何Visiblity值始终有效.
在我的前端,我有一些选择.
Dictionary<string, int>或a中Dictionary<int, string>.我可以手工编写一个枚举,只需在极少数事件中手动编辑值,即表格有变化.例如,
public enum Visiblity
{
Visible,
Invisible,
Collapsed
}
你会建议哪个?为什么?
谢谢.
我公司在我们的一个产品中使用ElevateDB.但是,我们的数据库只是一堆表.最近,随着更多功能的设计和更多模块的添加,我们发现我们的数据不再是"一堆不相关的表",而是开始是真正的数据结构.
我以前没有使用ElevateDB的经验,我主要使用Oracle,MSSQL和Firebird.所以问题是 - 如果我们想要重组表结构以具有外键约束并实现关系完整性,那么ElevateDB上常见的陷阱是什么?我不是在询问有关关系数据库的一般问题,但我对ElevateDB有兴趣并且不感兴趣.
我们使用Delphi 2009作为客户端应用程序.
我正在尝试使用此处描述的物化路径模型实现树状结构:http://www.dbazine.com/oracle/or-articles/tropashko4.
是否可以在[path]字段上强制引用完整性?我不知道SQL如何做到这一点,我是否必须在DAL中手动完成?
我最近在Fowler的PofEA中读到,一些数据库引擎允许您将RI检查推迟到事务结束.这可能在SQL Server中吗?
问题出现在某些情况下,我试图保存包含插入和删除的更改,确定执行操作以避免RI失败的正确顺序可能很棘手.我知道在交易结束时RI会很好,所以推迟这些检查似乎是理想的.
您是否看到数据库触发器/参照完整性规则以改变数据库中实际数据的方式使用(更改表x中的行w会导致表z中的行y发生更改)?
如果是的话,这与内存缓存(memcache和朋友)的日益普及有什么关系呢?毕竟,这些操作发生在数据库内部,但缓存系统必须知道它们以反映正确的状态(或至少使可能更改的状态无效).我发现很难相信为这种情况实施了回调.
考虑到这样的设置并放弃它,有没有人拥有这种设置/现实世界体验的实际经验(你走哪条路?如果缓存,你如何强制执行完整性?)
我有一个表,ProductSupportArticles:
ProductSupportArticleID int NOT NULL <primary key>
ParentArticleID int NULL
ProductID int NOT NULL
Title varchar(100) NOT NULL
Content varchar(MAX) NOT NULL
Run Code Online (Sandbox Code Playgroud)
ProductID是Products.ID的外键,ParentArticleID是同一个表的外键,ProductSupportArticles.ProductSupportArticleID.我有一个检查约束ProductSupportArticleID!= ParentArticleID,以便文章不能是它自己的父项.
但是,与特定产品有关的支持物品不应该是与不同产品有关的物品的父母或子女.如何添加检查约束或类似说法:(ProductID = (SELECT ProductID FROM ProductSupportArticles P WHERE ParentArticleID = P.ProductSupportArticleID))
或者我应该如何以不同方式实现我的表?
可能重复:
外键约束可能导致循环或多个级联路径?
我有一个联系人详细信息数据库,其中包含四个主要表:
这是一个图表(箭头表示外键约束):
重要提示:我不小心将绿色箭头标记为指向per_PerID.它应该指向per_SecID

我创建了约束,确保每个部门记录属于一个组织,每个部分属于一个部门,等等.这些外键约束的操作设置为CASCADE,因此删除组织将删除所有相应的部门等.
问题是每个组织都需要有一个负责人.这将转换为字段上的外键约束,该约束将包含负责人的ID.创建约束很简单,但是当我尝试将操作设置ON DELETE为时SET NULL,我收到以下错误:
在表格上引入FOREIGN KEY约束...可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.
我的理由是,只有当我设置动作时才会发生循环,但CASCADE不是SET NULL,但显然这是不正确的.
- 人员记录已删除
org_incharge_PerID在相应的组织记录中设置为null- 没有进一步的传播.如果组织已被删除,则会出现问题,因为部门也会引用组织.事实上,不应该有问题.
是否有另一种方法可以确保引用完整性,还是应该重新考虑我的表结构,以一种可以完全避免周期问题的方式?
我想要的是org_incharge_PerID被限制per_PerID在人员表中的s 集合.此外,NULL如果删除该人,我希望将值设置为.
sql-server database-design referential-integrity foreign-key-relationship sql-server-2008
我有两个表,object和object_data,对象通过外键引用object_data(关系是1:1).对于一组对象,我需要将其object_data引用置空并删除相应的object_data行,如下所示:
DELETE FROM object_data WHERE id IN
( SELECT object_data_id FROM object WHERE ... );
UPDATE object SET object_data_id = NULL WHERE ...;
Run Code Online (Sandbox Code Playgroud)
问题是,外键约束不允许删除仍然从对象引用的object_data行.
我当前的解决方案是将结果读SELECT入列表,然后将外键置零,然后使用IN运算符以合理大小的批量删除object_data行.有更好的解决方案吗?添加从object_data引用回对象的列不是一个选项.
我有一张公司拥有的电话号码表和一个电话记录表.每个呼叫记录包括(非空)源和目的地号码.我被赋予了完整性约束,即源号或目的地号码(但不是两者)都可以是不在电话号码表中的号码(因为它们不是该公司拥有的号码).换句话说,我需要确保其中至少有一个是电话号码表的外键.
create table phonenumber (
phonenum numeric(10,0) not null,
primary key (phonenum)
);
create table call_record (
URID varchar(20) not null,
c_src numeric(10,0) not null,
c_dst numeric(10,0) not null,
primary key (URID)
);
Run Code Online (Sandbox Code Playgroud)
以下听起来像我想要的但不是有效的SQL:
constraint call_constraint check (
foreign key (c_src) references phonenumber (phonenum) or
foreign key (c_dst) references phonenumber (phonenum)
)
Run Code Online (Sandbox Code Playgroud)
有没有办法在DDL中指定它?如果没有,我将如何编写触发器来强制执行此操作?
在与朋友的讨论中,我听到了两件事 -
使用约束会导致性能略有下降.例如.考虑唯一性约束.在插入之前,DBMS必须检查所有现有数据的唯一性,从而导致额外的计算.
他建议确保在应用程序级逻辑本身处理这些约束.例如.正确地从两个表中删除行,而不是放置外部完整性约束等.
第一个对我来说听起来有点合乎逻辑,但第二个看起来很直观.我没有足够的DBMS经验来真正判断这些说法.
问:索赔1是否正确?如果是这样,即使是处理此类情况的正确方法,索赔2也是如此?
database database-design referential-integrity database-performance
database ×4
sql ×3
sql-server ×3
foreign-keys ×2
c# ×1
caching ×1
constraints ×1
delphi ×1
enums ×1
memcached ×1
oracle ×1
postgresql ×1
transactions ×1
tree ×1
triggers ×1