数据库设计中的封装或抽象

时间:2014-08-31 04:18:42

标签: database-design

在我的主要语言(C#)中,它非常容易抽象数据类。例如:

public interface IFruit
{
    public TimeSpan GrowthTime { get; set; }
    public string Color { get; set; }

}

public class Apple : IFruit
{

    public TimeSpan GrowthTime
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }

    public string Color
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }
}  

您如何在数据库设计中实现此类功能?我们假设我有一个名为Bulletins的表,它可以容纳许多不同类型的公告,无论它们是AnnouncmentsAds还是Events

我考虑过创建一个Bulletins表和一个单独的表,用于上述每个类,FK表中包含每个Bulletins列;但是,这不起作用,因为FK是强制性的(或者如果使它们无效则相当不好)并且一个Bulletin帖子永远不会超过上面列出的一个类别。

我可以为每个表创建单独的表,但用户的外部模型视图只是Bulletins的表。对他们来说,他们看到的公告可以是不同的类型,而不是每个单独的实体。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  

FK是强制性的(或者如果取消它们则是不好的做法)

实际上并非如此。使用NULL外键来模拟“可选”父级是完全合法的。虽然你不一定需要继承。

今天的关系数据库本身不支持继承 1 ,因此OOP和数据库之间存在需要克服的“阻抗不匹配”,并且couple of ways可以执行此操作,没有一个是理想的。

我的默认方法可能是“每桌一类”,在应用程序级别强制执行儿童的排他性和存在,并且只有在有特定原因时才查看其他方法。


1 在数据库建模中也称为“类别”或“泛化层次结构”或“子类化”。