我有这个拿出几次在我的职业生涯,并没有我的地方的同龄人似乎可以回答这个问题.说我有,有一个"描述"字段是一个候选键,但表有时用户会经由过程中途停止.因此,对于大约25%的记录,此值为null,但对于所有非NULL的记录,它必须是唯一的.
另一个例子是,必须维护多个记录的"版本"的表,和位值表示哪一个是"活动"之一.因此总是填充"候选键",但可能有三个版本相同(在活动位中为0)并且只有一个是活动的(活动位中为1).
我有其他方法来解决这些问题(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,在需要历史记录时使用触发器和UNION表填充表) .我不想要替代方案(除非有明显更好的解决方案),我只是想知道SQL的任何风格是否能以这种方式表达"条件唯一性".我正在使用MS SQL,所以如果有办法在那里做,那很好.我大多只是在学术上对这个问题感兴趣.
sql sql-server sql-server-2005 check-constraints unique-constraint
我正在为我们的网站添加功能,它使用MSMQ异步执行长时间运行的进程.但是,执行此ansynch意味着我们需要在完成请求时通知用户.使用命令模式,我创建了一个名为INotify的接口*并将其组成到消息类中,因此消息处理类可以简单地在消息的INotify对象上调用GiveNotice().第一个实现,EmailNotify,比预期更困难,因为我惊讶地发现MailMessage不可序列化,但它已经开始了.
现在我正在开发一个新的具体通知程序DBNotify,它将调用某种类型的SP并更新主事务数据库中的状态.我被绊倒了,因为我想重用我们已经创建的DAL架构,但是INotify是Model项目的成员,它比DAL更基础.
我们的层次结构如下所示:Common> Model> DAL> BAL
这里有关于层级的更多细节.请记住,我继承了以下内容:Common负责所有"实用程序"函数,这些函数在应用程序中的许多位置使用,例如访问配置设置,解析字符串,非业务相关功能.
模型是业务对象,有些人称之为数据传输对象,是getter和setter的集合.我在这一层添加了一些"智能",但只有该对象内部的业务规则,例如"一个项目的名称必须以字母数字字符开头".
DAL是数据访问层,理论上,这里发生的所有事情都是模型对象被移入和移出数据库.
BAL是业务层; 理论上,强制执行管理对象交互的业务规则(即"表单必须至少包含两个项目".).
因此,INotify接口被定义为抽象,以允许通知方法独立变化(即电子邮件,TXT,推特等).它是系统的基础,因此我在Model层创建了它,它独立于DAL层.但是,我正在创建一个新的INotify具体实现,其通知方法是在数据库中调用SP.
有没有其他人处理过一个业务对象,其目的是与数据库进行交互,以及如何将其置于您的N层架构中?
在你告诉我使用Linq to Sql之前,非常感谢.这不是一个技术问题(我该怎么做),这是一个设计问题(我该怎么做).
我认为StackExchange站点更侧重于这些与语言无关的设计问题,因此我将在那里复制它.