任何版本的SQL Server都支持可延迟约束(DC)吗?
从版本8.0开始,Oracle支持可延迟约束 - 仅在提交语句组时评估的约束,而不是在插入或更新单个表时.可延迟约束不仅仅是禁用/启用约束,因为约束仍处于活动状态 - 它们仅在稍后(批处理提交时)进行评估.
DC的好处是它们允许评估单独非法的更新,这些更新累积地导致有效的最终状态.一个示例是在两行之间的表中创建循环引用,其中每行需要存在一个值.没有单独的插入语句会通过约束 - 但组可以.
为了阐明我的目标,我希望将C#中的ORM实现移植到SQLServer - 遗憾的是,实现依赖于Oracle DC来避免在行之间计算插入/更新/删除命令.
我想在一个表中定义两个可空FK之间的约束,其中如果一个为空,另一个需要一个值,但两者都不能为空,两者都不能有值.逻辑是派生表从任一FK表继承数据以确定其类型.另外,对于有趣的奖励积分,这是一个坏主意吗?
我正在开发旅行管理应用程序.有问题的设计如下:
旅游中的每个人都被指定为旅行者.每位旅行者都有护照.现在,旅行者可以是主会员或子会员,具体取决于他是否是家庭主管.MainMember决定像TourPackage这样的东西,他的旅行家庭的总金额等.一个SubMember在旅行时依赖于MainMember.因此,如果删除了MainMember,则还必须删除其所有子成员.
所以,旅行者有护照.(一对一关系)旅行者是主会员或子会员.(Traveler-MainMember和Traveler-SubMember之间的一对一/一)MainMember可能有几个SubMembers.(一对多)子成员只有一个主要成员.(多到一个)
我目前的ERD如下.

如您所见,三个表 - Traveler,MainMember和SubMember - 形成了循环依赖.不过,我不确定它是否会伤害我的应用程序.如果我删除作为MainMember的Traveler,则1.删除Traveler中的记录.2.删除其相关的MainMember记录.3.删除依赖于MainMember的SubMember记录.4.删除子成员的旅行者记录.
虽然它似乎不是问题,但由于Traveler-MainMember删除将始终只删除Traveler-SubMember(s).不过,我对此感觉不好.
任何人都可以指导我更好的设计吗?
更新 -
在等待回复的同时,我根据@ Daveo的回复提出了另一种设计.基本上,Traveler包含自引用外键.SubMember记录将使用它来识别他们的父母.
这是ERD.

现在,正如@Branko指出的那样,我之前的设计中没有循环依赖问题,我想知道哪种设计更好?
另外,通过Hibernate实现哪种设计会更好?我认为第二种方法可能会在通过Hibernate实现时导致复杂性.
我还要感谢关于您喜欢的设计的实现模式(Hibernate实体中的继承等)的一些指示.
database-design erd circular-dependency hibernate-mapping class-table-inheritance
我需要了解超级密钥和复合密钥之间的区别.我发现的例子让人更加困惑.你能简单地澄清一下有什么区别吗?谢谢
我经营一家小型食品生产企业,我需要管理客户订单.我已经构建了我的业务这方面的概念数据模型,但我需要一些关于如何在RDMS中完全实现它的指针.
作为第一步,我提出了下面给出的逻辑模型.我对数据建模的了解有限,因此我的图表中可能存在错误,但希望它能传达我的意图.请注意,这仅仅是较大模式的简化部分,为简单起见,我仅提供相关表格.

我在MySQL中实现了上面的模式,我编写了一些小程序来用客户订单填充表.这可以完成工作,但没有太多考虑数据完整性.我注意到,通过此实现,一些数据完整性规则不会在数据库级别强制执行.
例如,FoodItem是OrdrItem的子类型.对于FoodItem中的每一行,OrdrItem中必须只有一个对应的行.但是,在其当前实现中,我可以从FoodItem中删除一行,从而在OrdrItem中留下一行而在其中一个子类型表中没有相应的行.这应该是不允许的.
我希望将这些数据完整性规则融入到数据库中,这样我就不必担心自己在每个新客户端应用程序中执行它们,抛弃脚本或我写的伪劣SQL语句.我怀疑,如果我不在数据库级别做出这些保证,那么我将极大地增加遇到数据完整性问题的可能性.
我对存储过程,触发器和用户定义的函数只有最微弱的了解.我得到的印象是,部分或全部这些功能可以帮助我实现我想要的目标.但是,如果我能完成检查约束,外键和相对简单的功能,我很乐意走这条路.基本上,我希望尽可能地限制复杂性,如果没有保证,不要引入每个漂亮的数据库功能.是否有可能确保我想要的数据完整性,而无需借助存储过程,触发器,用户定义的函数和其他更深奥的数据库功能?
我愿意使用MySQL或Postgresql来实现我的解决方案,因为我对两个系统都有基本的工作知识.
最后,如果这种对数据完整性的方法被认为是过度的,或者如果有一个更实用但稍微不完美的解决方案,我也会对此持开放态度.
我有一个产品表,products
它具有3个字段(名称,模型(PK)和类名)。该类对应于一个表。所以这是一个例子:
产品表:
model | name | class_Name
z123 | Abcd | AMPS
Run Code Online (Sandbox Code Playgroud)
AMPS表:
model | attribute_1 | attribute_2
z123 | blah blah | blah blah
Run Code Online (Sandbox Code Playgroud)
题:
我是否应该有一个包含PK(模型)及其相应类名的表,然后在我的产品表中使用该类ID?有一个表来容纳所有模型及其类的表会更有效吗?
sql database-design relational-database class-table-inheritance
我关注的用户可以是"未经证实"或"已确认".后者意味着他们获得完全访问权限,前者意味着他们在主持人批准后待审.我不确定如何设计数据库来考虑这种结构.
我有一个想法是有两个不同的表:confirmedUser和unconfirmedUser非常相似,只是unconfirmedUser有额外的字段(例如"emailConfirmed"或"confirmationCode").这有点不切实际,因为当用户被接受时我必须复制所有信息(虽然我想它不会那么糟糕 - 不要期待繁忙的流量).
我想象的第二种方式是实际将所有用户放在同一个表中,如果需要,可以使用额外的"未经证实的"数据来获取表的密钥(也许还可以在用户表中添加"已确认"标志).
每种方法的缺点有哪些优点,是否有更好的方法来设计数据库?
我应该发送一个包含可变内容的盒子并在数据库中跟踪它.我的所有项目(框的内容)都是不同的类型,并且需要不同的表来跟踪它们各自的信息,尽管每个项目类型具有相同的长度序列号(即PK是相同的数据类型).我有一张Boxes表.
所以每个项目都有一个表(~7个表)和盒子表.我想创建一个BoxContents表.我尝试用两列创建一个多对多关系中间表:一个用于BoxID和一个用于ItemBarcode,其中BoxID是Boxes表格中PK的FK,并且ItemBarcode是项目表中每个PK的FK(即I试图将多个表链接到同一列).不出所料,这不起作用.我尝试插入一个项目,除了其中一个ItemBarcode关系外,其他所有人都违反了FK约束.
如何构建我的关系以将多种类型的项链接到一个表中的一个框?这是合乎逻辑的方法吗?你需要更多的信息?