在我的主要语言(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
的表,它可以容纳许多不同类型的公告,无论它们是Announcments
,Ads
还是Events
。
我考虑过创建一个Bulletins
表和一个单独的表,用于上述每个类,FK
表中包含每个Bulletins
列;但是,这不起作用,因为FK是强制性的(或者如果使它们无效则相当不好)并且一个Bulletin
帖子永远不会超过上面列出的一个类别。
我可以为每个表创建单独的表,但用户的外部模型视图只是Bulletins
的表。对他们来说,他们看到的公告可以是不同的类型,而不是每个单独的实体。有什么建议吗?
答案 0 :(得分:1)
FK是强制性的(或者如果取消它们则是不好的做法)
实际上并非如此。使用NULL外键来模拟“可选”父级是完全合法的。虽然你不一定需要继承。
今天的关系数据库本身不支持继承 1 ,因此OOP和数据库之间存在需要克服的“阻抗不匹配”,并且couple of ways可以执行此操作,没有一个是理想的。
我的默认方法可能是“每桌一类”,在应用程序级别强制执行儿童的排他性和存在,并且只有在有特定原因时才查看其他方法。
1 在数据库建模中也称为“类别”或“泛化层次结构”或“子类化”。