在Neo4j中存储和检索从其他对象继承属性的对象的推荐方法是什么?
模型看起来像这样:
public class Base
{
public string BaseProperty { get; set; }
}
public class DerivedA : Base
{
public string DerivedAProperty{ get; set; }
}
public class DerivedB : Base
{
public string DerivedBProperty{ get; set; }
}
我们有很多派生模型。我们的第一个解决方案是为每个派生类型创建一个事务,其中包括Base的属性。问题:每当Base发生变化时,我们都必须更改所有派生类型的所有事务。
下一个解决方案是编写一个单独的Transaction for Base,它首先将其属性存储到neo4j中。然后在确定哪个派生类型之后,创建另一个事务来存储派生类型的剩余属性。这样,交易数量翻倍,但我们有一个清晰的分离,使更改变得更容易。
检索更难。如果我们想要获取存储在Neo4j中的所有DerivedA类型,我们首先要有一个检索基本属性的事务。然后我们确定派生的Type并跟进一个从派生类型中检索属性的新事务。现在我们必须以正确的方式将两个事务的结果混合在一起,以获得包含所有属性的完整derivedA列表。
有更简单/更好的方式吗?
答案 0 :(得分:1)
虽然你的问题很广泛,但还有一种替代方法可以继承。如果这是你的问题,我认为这是一个有效的问题。
继承的替代方法是(例如)装饰器模式:
核心原则(来自头脑设计模式的接受者):
装饰器模式的关键点在于它是继承的替代方法,具有在运行时更改和扩展行为的能力,并且不会绑定到具有特定版本或其他依赖项的某个基类。
一个例子,来自这个答案here:
主题的更多信息我会改变它以使其更具代表性。
public interface IStudent //this would rather be called an IInformationDisplayer
{
string DisplayInformation();
}
public class Student : IStudent
{
public string Name, Grade, Age, etc... { get; set; }
private IStudent _student = null;
public Student() { }
public Student(IStudent student) { _student = student; }
public string DisplayInformation()
{
return $"{_student?.DisplayInformation()}" +
$"{Name} - {Age} years old is in {Grade} grade";
}
}
public class ScienceStudent : IStudent //it's still a decorator
{
public string Labs { get; set; }
private IStudent _student;
public ScienceStudentDecorator(IStudent student)
{
_student = student;
}
public string DisplayInformation()
{
var info = _student?.DisplayInformation();
return $"{info}. Labse are {Labs}";
}
}