C# 正在创建一个;“虚拟记录”;迫使数据库服从业务逻辑,这是个好主意还是个愚蠢的主意?
在一些项目中,我看到需要在Db中创建一个虚拟记录,以便在不破坏Db约束的情况下保持业务逻辑继续 到目前为止,我已经从两个方面了解了它的用法:C# 正在创建一个;“虚拟记录”;迫使数据库服从业务逻辑,这是个好主意还是个愚蠢的主意?,c#,.net,oop,database-design,dummy-data,C#,.net,Oop,Database Design,Dummy Data,在一些项目中,我看到需要在Db中创建一个虚拟记录,以便在不破坏Db约束的情况下保持业务逻辑继续 到目前为止,我已经从两个方面了解了它的用法: 通过添加类似IsDummy的字段 通过添加一个名为ObjectType的字段,它指向一个类型:Dummy 好的,它有助于实现需要实现的目标 但让我对此类解决方案感到警惕的是,有时您必须记住,应用程序中存在一些需要在某些进程中处理的虚拟记录。如果没有,你将面临一些问题,直到你意识到它们的存在,或者直到团队中的某个人告诉你“啊哈!你忘记了虚拟记录。你也应该
- 通过添加类似IsDummy的字段
- 通过添加一个名为ObjectType的字段,它指向一个类型:Dummy
谢谢 使用虚拟记录不如获得正确的约束
使用虚拟记录通常是一种诱惑,因为使用虚拟记录似乎是交付新功能的最快方式(有时可能是),但它们从来都不是良好设计的一部分,因为它们隐藏了域逻辑和数据模型之间的差异。我从未遇到过必须这样做的情况。如果您需要这样做,那么您的数据结构可能有问题,这将进一步导致报告方面的问题…我认为添加“虚拟”记录的唯一原因是当您的应用程序和数据库设计非常糟糕时 这绝对不是常见的做法
如果您的业务逻辑依赖于现有的记录,那么您需要做两件事之一:要么确保在执行该逻辑之前创建了正确的记录;或者,更改逻辑以将丢失的信息考虑在内。我认为,任何不能很容易区分为“业务逻辑”的情况都需要尝试想出更好的方法 您提到“whichpointastype:Dummy”这一事实让我相信您正在使用某种ORM来处理数据访问。对于像NHibernate这样的ORM解决方案来说,一个非常好的检查点(尽管不是唯一的)是源代码非常明确地描述了驱动应用程序的数据结构。这不仅允许在源代码控制下轻松管理数据访问,而且还允许在出现问题时进行更轻松的调试(让我们面对现实,问题不在于是否会发生,而在于何时发生) 当您引入某种“拐杖”如虚拟记录时,您忽略了数据库的作用。有一个数据库可以对您的数据强制执行规则,以消除对这种事情的需要。我建议您在使用这种技术之前,先看看应用程序逻辑。想想你的同事德夫,或者一个新员工。如果他们需要添加一个特性而忘记了你的小“虚拟记录”逻辑呢 你在问题中提到自己时感到恐惧。跟着你的直觉走。摆脱虚拟记录。使用虚拟记录是愚蠢的
总的来说,你应该在没有它们的情况下把你的逻辑弄对。我也见过它们被使用,但只是作为紧急解决方案。你的描述听起来太像一种标准做法了。这将导致比它解决的问题更多的问题。我不得不同意这里的普遍看法,反对虚假记录 将会发生的情况是,一个新的开发人员不知道它们,也不会编写代码来处理它们,或者删除一个表而忘记添加一个新的虚拟记录 我曾在遗留数据库中体验过它们,并目睹了上述两种情况的发生
而且,它们存在的时间越长,就越难将它们取出,并且您必须编写更多的代码来考虑这些虚拟记录,如果您只是在没有它们的情况下进行原始设计,这些虚拟记录可能会被删除。正确的解决方案是更新您的业务逻辑 引用您的详细解释: 假设您有一个包对象,并且您已经实现了一个业务逻辑,即无法创建没有任何内容的包。您创建了一些业务层规则,并使用相关约束设计了数据库。但几年后,需要一个新特性,要实现这一点,您必须能够创建一个没有content的包。为了克服这个问题,您决定创建一个虚拟内容,它在UI上不可见,但允许您创建一个空包 因此,在某一时间,不包含内容的包的内容是无效的,因此业务层强制在包对象中存在内容。这是有道理的。现在,如果真实世界的场景发生了变化,那么现在需要一个有效的理由来创建没有内容的包对象,那么需要改变的是业务逻辑层 几乎在任何地方普遍使用“虚拟”任何东西都是一个坏主意,通常表明实现中存在问题。在本例中,您使用的是虚拟数据,以允许“遵从”业务层,该层不再准确地表示业务的实际约束
若并没有内容的包是无效的,那个么允许“遵从”业务层的虚拟数据就是愚蠢的黑客行为。本质上,您编写规则是为了保护您自己的系统,然后是如何试图规避您自己的保护。另一方面,如果没有内容的包是有效的,那么业务层就不应该强制执行虚假的约束。在这两种情况下,虚拟数据都无效。只有在模式