【发布时间】:2021-11-04 14:19:52
【问题描述】:
我正在尝试将复杂的监管分类数据集导入新数据库。复杂性来自于将不同种类的分类器分配给相同的分类对象。有分层(一对多)“类别”和非分层(多对多)“属性”,每个“属性”都有指定的值范围。问题在于填充数据。由于每个最低“类别”的非分层“属性”都不相同,因此仅标记secondary 关系属性和a.append(b) 不会为连接表生成所需的输入。 JSON 将是一种很好的格式,但由于记录数量众多,它不可行。我正在寻找保留和填充下面提供的架构的最佳方式。这是一个简化的示例:
Supercat Category Subcategory Attr.Type Attribute Attr.Value
Vertebrae Mammals Cats Color Hair Color Blue
Hair Color Black
Eye Color Blue
Eye Color Green
Magic Yes/No Maybe
Legs Count 4
Habitat Land/Sea Land
Dogs Color Hair Color Brown
Hair Color Black
Eye Color Blue
Eye Color Green
Magic Yes/No No
Legs Count 4
Tailwags Happy Yes
Unhappy No
Habitat Land/Sea Land
Whales Color Skin Color Blue
Skin Color Grey
Habitat Land/Sea Sea
Unicorns Color Hair Color Rainbow
Magic Yes/No Yes
Habitat Land/Sea Unknown
Legs Count 4
Hooves Yes
Fish Sharks Color Skin Color White
Skin Color Grey
Magic Yes/No No
Habitat Land/Sea Sea
Goldfish Color Scales Gold
Habitat Land/Sea Sea
这是此设置的架构的 SQLAlchemy ORM 表示:
#connection tables:
attribute_type_attributes = db.Table('attribute_type_attributes',
db.Column('type_id', db.ForeignKey('attribute_types.id'), ...),
db.Column('attribute_id', db.ForeignKey('attributes.id'), ...)
)
attribute_values_attributes = db.Table('attribute_type_attributes',
db.Column('type_id', db.ForeignKey('attribute_types.id'), ...),
db.Column('value_id', db.ForeignKey('attribute_values.id'), ...)
)
subcategory_attribute_types = db.Table('subcategory_attribute_types',
db.Column('type_id', db.ForeignKey('attribute_types.id'), ...),
db.Column('subcat_id', db.ForeignKey('subcats.id'), ...)
)
subcategory_attributes = db.Table('subcategory_attributes',
db.Column('type_id', db.ForeignKey('attributes.id'), ...),
db.Column('subcat_id', db.ForeignKey('subcats.id'), ...)
)
subcategory_attribute_values = db.Table('subcategory_attribute_values',
db.Column('type_id', db.ForeignKey('attribute_values.id'), ...),
db.Column('subcat_id', db.ForeignKey('subcats.id'), ...)
)
#models:
class Supercat(db.Model):
id = db.Column(...)
name = db.Column(...)
class Cat(db.Model):
id = db.Column(...)
supercat_id = db.Column(..., db.ForeignKey('supercats.id'), ...)
name = db.Column(...)
class Subcat(db.Model):
id = db.model(...)
cat_id = db.Column(..., db.ForeignKey('cats.id'), ...)
name = db.Column(...)
class Attribute_type(db.Model):
__tablename__ = 'attribute_types'
id = db.Column(...)
name = db.Column(...)
class Attribute(db.Model):
__tablename__ = 'attributes'
id = db.Column(...)
name = db.Column(...)
class Attribute_value(db.Model):
__tablename__ = 'attribute_values'
id = db.Column(...)
name = db.Column(...)
同样,不同的分层“类别”具有不同的非分层“属性”,它们与不同的值集相关。我不能拥有与错误“子类别”相关的非分层“属性”或其值,因为数据不是我可以更改的。
有什么想法吗?
【问题讨论】:
-
在您的表格列表中有对
attribute_types.id和attributes.id的引用,但这些表格不包括在内。可以包含整个架构吗? -
我现在在现有模式中显示了
__tablename__类属性。给定类名,这些是隐含的。大多数其他细节仍然被省略,以便专注于通用解决方案。 -
抱歉,我不熟悉 SQLAlchemy,我希望看到第一部分中指定的所有相关表/列(例如
#connection tables:)和/或只是底层 SQL DDL。
标签: python postgresql sqlalchemy many-to-many flask-sqlalchemy