inheritance - Azure 表和实体继承

标签 inheritance database-design entity azure-storage

假设我正在为 vert 和他们照顾的动物建立一个数据库。我有以下实体:

动物类:TableServiceEntity
狗类:动物
猫类:动物

狗和猫各有独特的属性。我有一个名为 Vets 的 Azure 表,其中 vet.Guid 作为分区键,“Dog_”+ dog.Guid 或“Cat_”+ cat.Guid 作为行键。如果我要通过使用 AsTableServiceQuery() 检索所有内容,我能否将动物实体转换为具有这些独特属性的 Dog 或 Cat?

从更广泛的意义上讲,在这种情况下,每个人的权衡取舍是什么?在将 Dog 和 Cat 保留在一个表中以进行高效查询但在业务层中执行额外步骤与使用单独的表进行额外查询但不那么困惑的代码之间?

最佳答案

请记住,Windows Azure 表中的数据以 AtomPub 格式返回给您。因此,您有一个将 XML 映射到 DTO 上的公共(public)属性的序列化过程。您可以指定在额外或缺少属性的情况下要做什么(视为错误或忽略)。此外,您可以选择通过 Hook ReadingEntity 事件自行覆盖序列化过程。

因此,在您的问题的上下文中,您需要记住,如果您要序列化为 Animal,则不能转换为 Dog,因为您需要在运行时指定序列化类型。例如

ctx.CreateQuery<TypeToSerialize>().Where(s => s.Property == blah);

如果您选择 TypeToSerialize 作为 Dog,您总是可以向下转换为 Animal,但这可能没有那么有用。但是,如果您选择 TypeToSerialize 作为 Animal,那么 Dog 所拥有的信息将已经丢失,因为它不会在任何地方被序列化并且会被有效地忽略。

我提到 ReadingEvent 的原因是您可以自己处理序列化,然后所有的赌注都取消了。您可以检查返回的属性并决定您希望序列化为哪种类型,或者您可以将额外的属性存储到属性包中,等等。

HTH

关于inheritance - Azure 表和实体继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942326/

相关文章:

C++如何创建创建派生类对象的基类,并访问基类的私有(private)成员?

Java继承最大化重用

mysql - 建立索引时速度更快。 MySQL 中的 INT (10) 或时间戳

database - 关系设计 : Column Attributes

"/"的 XML 实体?

python - 使用 Python 实现树时出错

javascript - KnockoutJS 通过 ko.utils.extend 继承功能

mysql - 如何处理存储日期和时间的应用程序中的多个时区?

Java 架构 3 层对象设计

ios - 为什么实体需要逆?