Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在创建一个;“虚拟记录”;迫使数据库服从业务逻辑,这是个好主意还是个愚蠢的主意?_C#_.net_Oop_Database Design_Dummy Data - Fatal编程技术网

C# 正在创建一个;“虚拟记录”;迫使数据库服从业务逻辑,这是个好主意还是个愚蠢的主意?

C# 正在创建一个;“虚拟记录”;迫使数据库服从业务逻辑,这是个好主意还是个愚蠢的主意?,c#,.net,oop,database-design,dummy-data,C#,.net,Oop,Database Design,Dummy Data,在一些项目中,我看到需要在Db中创建一个虚拟记录,以便在不破坏Db约束的情况下保持业务逻辑继续 到目前为止,我已经从两个方面了解了它的用法: 通过添加类似IsDummy的字段 通过添加一个名为ObjectType的字段,它指向一个类型:Dummy 好的,它有助于实现需要实现的目标 但让我对此类解决方案感到警惕的是,有时您必须记住,应用程序中存在一些需要在某些进程中处理的虚拟记录。如果没有,你将面临一些问题,直到你意识到它们的存在,或者直到团队中的某个人告诉你“啊哈!你忘记了虚拟记录。你也应该

在一些项目中,我看到需要在Db中创建一个虚拟记录,以便在不破坏Db约束的情况下保持业务逻辑继续

到目前为止,我已经从两个方面了解了它的用法:

  • 通过添加类似IsDummy的字段
  • 通过添加一个名为ObjectType的字段,它指向一个类型:Dummy
好的,它有助于实现需要实现的目标

但让我对此类解决方案感到警惕的是,有时您必须记住,应用程序中存在一些需要在某些进程中处理的虚拟记录。如果没有,你将面临一些问题,直到你意识到它们的存在,或者直到团队中的某个人告诉你“啊哈!你忘记了虚拟记录。你也应该这样做…”

所以问题是: 创建虚拟记录以保持业务逻辑不变而不引起数据库抱怨是一个好主意吗?如果是,防止开发人员跳过其存在的最佳实践是什么?如果没有,你该怎么做才能防止自己陷入这样的境地:你最终只能选择创建一个虚拟记录


谢谢

使用虚拟记录不如获得正确的约束


使用虚拟记录通常是一种诱惑,因为使用虚拟记录似乎是交付新功能的最快方式(有时可能是),但它们从来都不是良好设计的一部分,因为它们隐藏了域逻辑和数据模型之间的差异。

我从未遇到过必须这样做的情况。如果您需要这样做,那么您的数据结构可能有问题,这将进一步导致报告方面的问题…

我认为添加“虚拟”记录的唯一原因是当您的应用程序和数据库设计非常糟糕时

这绝对不是常见的做法


如果您的业务逻辑依赖于现有的记录,那么您需要做两件事之一:要么确保在执行该逻辑之前创建了正确的记录;或者,更改逻辑以将丢失的信息考虑在内。

我认为,任何不能很容易区分为“业务逻辑”的情况都需要尝试想出更好的方法

您提到“whichpointastype:Dummy”这一事实让我相信您正在使用某种ORM来处理数据访问。对于像NHibernate这样的ORM解决方案来说,一个非常好的检查点(尽管不是唯一的)是源代码非常明确地描述了驱动应用程序的数据结构。这不仅允许在源代码控制下轻松管理数据访问,而且还允许在出现问题时进行更轻松的调试(让我们面对现实,问题不在于是否会发生,而在于何时发生)

当您引入某种“拐杖”如虚拟记录时,您忽略了数据库的作用。有一个数据库可以对您的数据强制执行规则,以消除对这种事情的需要。我建议您在使用这种技术之前,先看看应用程序逻辑。想想你的同事德夫,或者一个新员工。如果他们需要添加一个特性而忘记了你的小“虚拟记录”逻辑呢

你在问题中提到自己时感到恐惧。跟着你的直觉走。摆脱虚拟记录。

使用虚拟记录是愚蠢的


总的来说,你应该在没有它们的情况下把你的逻辑弄对。我也见过它们被使用,但只是作为紧急解决方案。你的描述听起来太像一种标准做法了。这将导致比它解决的问题更多的问题。

我不得不同意这里的普遍看法,反对虚假记录

将会发生的情况是,一个新的开发人员不知道它们,也不会编写代码来处理它们,或者删除一个表而忘记添加一个新的虚拟记录

我曾在遗留数据库中体验过它们,并目睹了上述两种情况的发生


而且,它们存在的时间越长,就越难将它们取出,并且您必须编写更多的代码来考虑这些虚拟记录,如果您只是在没有它们的情况下进行原始设计,这些虚拟记录可能会被删除。

正确的解决方案是更新您的业务逻辑

引用您的详细解释: 假设您有一个包对象,并且您已经实现了一个业务逻辑,即无法创建没有任何内容的包。您创建了一些业务层规则,并使用相关约束设计了数据库。但几年后,需要一个新特性,要实现这一点,您必须能够创建一个没有content的包。为了克服这个问题,您决定创建一个虚拟内容,它在UI上不可见,但允许您创建一个空包

因此,在某一时间,不包含内容的包的内容是无效的,因此业务层强制在包对象中存在内容。这是有道理的。现在,如果真实世界的场景发生了变化,那么现在需要一个有效的理由来创建没有内容的包对象,那么需要改变的是业务逻辑层

几乎在任何地方普遍使用“虚拟”任何东西都是一个坏主意,通常表明实现中存在问题。在本例中,您使用的是虚拟数据,以允许“遵从”业务层,该层不再准确地表示业务的实际约束


若并没有内容的包是无效的,那个么允许“遵从”业务层的虚拟数据就是愚蠢的黑客行为。本质上,您编写规则是为了保护您自己的系统,然后是如何试图规避您自己的保护。另一方面,如果没有内容的包是有效的,那么业务层就不应该强制执行虚假的约束。在这两种情况下,虚拟数据都无效。

只有在模式