我想创建一个具有不同键值作为属性的对象,例如:
animal
id
name
attribute
id
name
和映射
animal_attribute
animal_id
attribute_id
所以我可以有一个条目“duck”,它有多个属性“flying”,“swimming”等。每个属性类型都有自己的表定义一些变量
attribute_flying
animal_id
height
length
..
attribute_swimming
animal_id
depth
..
有更好的方法吗?对象布局如何在编程(python)中起作用?
答案 0 :(得分:4)
你有几种选择。 如果您没有非常深的对象层次结构和几个属性,那么您可以创建一个表并为需要支持的每个属性添加列
其他方法是为每个对象创建表,并将每个属性映射到不同的列。
由于以下问题,您想要使用的方法不是很好:
实际上这就是所谓的Entity-Attribute-Value反模式,如SQL Antipatterns一书中所述。
要解决此反模式,需要重新考虑如何将继承存储在数据库中。有几种方法:
完全解决方案取决于您的任务,目前很难确定什么是最佳解决方案。可能你应该使用每个子类的表。在这种情况下,您将在一个表中存储公共属性,并且动物的所有特定属性都会转到附加表中。
sqlalchemy支持所有三种主要类型的继承,请阅读documentation中的继承配置,并选择最适合您需求的内容。