繁体   English   中英

SQL Server数据库设计问题

[英]Sql Server database design issue

我有一个包含以下表格的应用程序。

Categories - CategoryID, CategoryName, CategoryTypeID, IsActive

CategoryTypes - CategoryTypeID, CategoryTypeName, IsActive

Items - ItemID, ItemName, CategoryID, UnitID, ItemPrice, IsActive

Units - UnitID, UnitName, IsActive

我有很多表,但是我没有全部显示,因为如果我有一个关系船的场景,我可以为其他关系做。

在上表中,此项目与具有CategoryID(ForeignKey约束)的Categories有关系

项目也与单位有关系(以UnitID作为Fk约束)。

现在在我的应用程序中,如果要删除在Items表中引用的Category。 如果未删除“项目”表中的引用记录,则无法删除“类别”。

因此,我必须先删除项目,然后再分类。

但是问题是我是否删除项目-无法删除它,因为ItemID也被另一个名为“ OrderItems”和“ Promotions”的表引用。

这是这两个表的表结构。

OrderItems - OrderItemID, OrderID, ItemId, ItemQuantity, ... , IsActive
Promotions - PromotionID, ItemID,... IsActive

现在发生了实际问题-如果要删除类别,除非并且直到删除项目,否则无法删除。

如果要删除某项,则该项所指向的所有参考表都必须删除,即表示OrderItems和Promotions。

但是作为业务逻辑,即使数据库(在Items表中)中不存在ItemID,我也需要显示OrderItems和Promotions。

由于具有OrderItems和Promotions的Items上有外键约束,因此无法实现Items记录的删除。

因此,我想知道-我可以将外键设为“允许空值”还是直接删除约束并仅使用普通表(认为该关系存在)。

我的另一个限制是,如果我尝试保留数据出口,但将IsActive状态设置为true或false(如果要删除记录,则将IsActive设置为false)。 但是数据库将继续增长,我认为这不是正确的方法。

我真的很担心这个问题,因为我对应用程序的删除功能感到震惊。

希望您在这里了解了我的问题。

任何帮助,高度赞赏。

考虑制作垃圾分类吗? 将项目移到那里并在所有处理中都禁止显示。

或者,允许项目不具有类别(CategoryID = null),从而将其更新为不具有类别。

我个人建议在类别表中将其设置为非活动状态。 我意识到您不喜欢数据库增长的想法,但是如果您要确保引用完整性,则不应删除正在使用的主键。

如果需要删除它们,则需要运行一个过程,该过程将项目表中的值设置为null,然后删除它们,并确保已将项目表的CategoryID列设置为允许空值。

编辑:基于OP注释的其他信息

也可以选择删除外键约束。 注意,尽管有了这个约束有两个好处。 第一个对您不太适用,但涉及速度。 外键约束使您可以在列上聚集索引,这将提高访问和连接这些行的速度。 如果您的数据库这么小,那么只有几百兆字节,您可能不会得到很大的提升。

另一个更重要的原因是因为它可以确保数据库的完整性。 尽管您可以做到,而且人们确实做到了,但是您自己管理的关系确实会带来风险。 请记住,您通常需要在业务逻辑中编写代码以检查是否存在匹配的键,通常在插入和访问时就存在。 对于小型程序,这很好,但是请注意,如果您打算扩展,因为以后可能会咬到您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM