因此,这是更好的:
- 一个需要注意的是可以有它不适用于(注意必须说明是为的预约的引用类型的空引用,但空的类型对于系统中不存在的帐户/其他对象)
- 复制相同逻辑但避免具有不相关注释引用的多个注释类型(AppointmentNote,AccountNote)。
也没有。另外,我不清楚我们是在谈论你的对象还是你的表格。
有一种类型的注释。它不应该引用它所涉及的对象。
public class Note
{
public DateTime CreatedAt { get; set; }
public string Content { get; set; }
}
public class Account
{
public ICollection<Notes> Notes { get; }
}
public class Appointment
{
public ICollection<Notes> Notes { get; }
}
然后有一对夫妇的方式来铺陈数据库表,这两个应该很容易地与任何ORM支持(虽然不一定容易,以支持一个不真正-AN-ORM,但-half-look-like-one,例如Linq2SQL或SubSonic,可为每个数据库表生成类的工具)。
首先DB布局:
TABLE Notes
(
Id,
CreatedOn,
Content,
AccountId,
AppointmentId
)
那么,如果n-1外键为空。这是每级类型的平行式样式,它被接受为对某些子类无效且无意义的列。
方法二:
TABLE Notes
(
Id,
CreatedOn,
Content
)
TABLE AccountNotes
(
AccountId,
NoteId
)
TABLE AppointmentNotes
(
AppointmentId,
NoteId
)
,这将是更多的表,每级的布局。没有人说你实际上需要在代码中使用子类注释类型 - 但即使你这样做了,为了避免“打击你的工具”,它并不意味着逻辑的重复 - 只需使用基本类型并将你的行为放在那里。
最后,你将不得不选择。关于预约的说明与账户记录本质上不同,你将不得不在某个层面上处理它。
为了让持久对象发生这种情况,Note将为n-1个字段(其中n是可以在其上注释的对象的数量)具有空fkeys。这是我用第一种方法解决问题的关键。多重性是'预约/账户1 - *注' – 2010-11-18 18:36:17
@SnOrfus:也许我没有看到关于你的ORM的东西(或者我可能只是休息一天)。但至少从领域的角度来看,让对象带着适用于他们的笔记似乎是有意义的。除非有一种情况,一个人从一张纸条开始,需要找到其父母?我认为笔记会是第一流的父对象的二等加载项。为什么笔记需要参考他们的父母? – David 2010-11-18 18:46:19