在SQL记录(实体)中表示关系数量限制

在SQL记录(实体)中表示关系数量限制,sql,math,relational-database,entity-relationship,Sql,Math,Relational Database,Entity Relationship,让应用程序使用数据库持久性实体框架,但不确定这是否重要 假设布局如下: 所有这些对象都源自AbstractBase。容器是充当任意数量AbstractBase派生对象集合的对象 问题 我想创建一个限制子系统,它允许我们定义容器中单个AbstractBase项的数量 例如,容器可以有零个容器,可以有零个或一个对象,必须有另一个对象,可以有许多抽象对象,等等 简单方法 AbstractBase中的一个名为CountRestrictor的字段,它是一个小整数。它对应于数据库外部的一个枚举,其中包含一个

让应用程序使用数据库持久性实体框架,但不确定这是否重要

假设布局如下:

所有这些对象都源自AbstractBase。容器是充当任意数量AbstractBase派生对象集合的对象

问题 我想创建一个限制子系统,它允许我们定义容器中单个AbstractBase项的数量

例如,容器可以有零个容器,可以有零个或一个对象,必须有另一个对象,可以有许多抽象对象,等等

简单方法 AbstractBase中的一个名为CountRestrictor的字段,它是一个小整数。它对应于数据库外部的一个枚举,其中包含一个属性。问题:数据库中不包含此项。对数据库的更改需要更改该枚举容器,从而重新生成该程序集。另外,我还得在别处写数学翻译代码

基于类的方法 那么,上课怎么样?问题是数据库中的类需要数据类型,所以我们可以将这个数学限制表示为数据类型吗?例如,我可以创建一个包含lambda表达式的一部分的类,该表达式可以稍后转换为表达式项吗?我不这么认为

我考虑过的事情 嵌入式数学逻辑 可能是具有CountObject.Restrictor属性的CountObject,该属性的类型为string,可以通过编程方式转换为表达式对象:

CountObject lessThanTwo = new CountObject { Restrictor = "< 2" };
CountObject exactlyOne = new CountObject { Restrictor = "= 1" };
这将完全允许使用Module.CountTranslator.LessThanTwo,但不会存储在数据库中,需要重新生成以进行更改。如果拼写错误少于两个,则会很敏感!=不到两个,仍然需要构建人到数学的代码:

…
Int count = container.AbstractBase.OfType<T>();
Int restrictor = obj.CountObject.Restrictor;

switch(restrictor)
{
    case CountTranslator.ExactlyOne // Have to make sure database record string spelled correctly
        if (count != 1)
            // do something
        …
 }
但这让我觉得非常丑陋,有很多条件检查

附加条件 最后,我考虑了附加条件。AbstractBase与CountObject有多对多关系

public class CountObject 
{
    private Int _value;
    private String _expression;

    public Int Value { get { return _value; } }
    public String Expression { get { return _Expression; } }
}

public partial class Container : AbstractBase
{
    …
    private Bool IsValidEntry<T>(T obj) where T : AbstractBase
    {
        Int count = AbstractBases.OfType<T>().Count;

        foreach (CountObject counter in obj.CountObjects)
        {
            switch(counter.Expression)
            {
                case "<":
                    if (count > counter.Value)
                        throw Exception;
                case "=":
                    if (count != counter.Value)
                        throw Exception;
                …
             }
         }
     }
 }
同样,这里有很多条件语句和switch语句

中国产业海外发展协会
还有别的办法给猫剥皮吗?也许是隐藏在.NET某处的数学翻译类?是否有一种方法可以举例说明最佳实践?

请您确定哪一位是关系型、数据库型或SQL型,我可以在这些方面为您提供帮助

很棒的类图。你有数据模型吗


RDBMS拥有并管理自己的数据缓存。所以我的第三个问题是,你为什么要写一个

我不是数据库专家。因此,我将所有业务逻辑都保存在代码中,使用db只是为了存储数据。话虽如此,我真的会在不涉及db的情况下解决您的问题。您的容器可能具有定义包含规则的类型或类似类型的属性,也可能是可插入策略类。该规则在添加元素时强制执行

…
Int count = container.AbstractBase.OfType<T>();
Int restrictor = obj.CountObject.Restrictor;

switch(restrictor)
{
    case CountTranslator.ExactlyOne // Have to make sure database record string spelled correctly
        if (count != 1)
            // do something
        …
 }
public class CountObject 
{
    private Int _value;
    private String _expression;

    public Int Value { get { return _value; } }
    public String Expression { get { return _Expression; } }
}

public partial class Container : AbstractBase
{
    …
    private Bool IsValidEntry<T>(T obj) where T : AbstractBase
    {
        Int count = AbstractBases.OfType<T>().Count;

        foreach (CountObject counter in obj.CountObjects)
        {
            switch(counter.Expression)
            {
                case "<":
                    if (count > counter.Value)
                        throw Exception;
                case "=":
                    if (count != counter.Value)
                        throw Exception;
                …
             }
         }
     }
 }