Python中数据表设计问题如何解决?
比如商品,商品分好几种类型,不同类型有自己的独有属性,那么设计的时候两种方案:
1. 一个类型设计一张表
2. 一张表,然后有个类型字段,属性都放这个表里面
优劣比较:
1. 逻辑清晰,但是维护多张表会麻烦,比如修改删除会操作多张表
2. 只需对一张表操作,但是字段属性看着会比较乱
还需要考虑什么呢?如何取舍?
Python中数据表设计问题如何解决?
属性要分表
对于Python中的数据表设计,核心是选择合适的库和遵循数据库设计原则。以下是具体方案:
1. 关系型数据(SQL)
# 使用SQLAlchemy ORM定义数据表
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base, relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
orders = relationship("Order", back_populates="user")
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
product = Column(String(100))
user = relationship("User", back_populates="orders")
# 创建表
engine = create_engine('sqlite:///app.db')
Base.metadata.create_all(engine)
2. 文档型数据(NoSQL)
# 使用MongoEngine(MongoDB)
from mongoengine import Document, StringField, ListField, ReferenceField
class User(Document):
name = StringField(required=True, max_length=50)
orders = ListField(ReferenceField('Order'))
class Order(Document):
product = StringField(required=True)
user = ReferenceField(User)
# 自动创建集合(表)
3. 内存/临时数据
# 使用Pandas DataFrame作为内存表
import pandas as pd
df_users = pd.DataFrame(columns=['id', 'name'])
df_orders = pd.DataFrame(columns=['id', 'user_id', 'product'])
# 或使用dataclass
from dataclasses import dataclass
from typing import List
@dataclass
class Order:
product: str
@dataclass
class User:
id: int
name: str
orders: List[Order] = None
设计要点:
- 明确业务关系(一对一、一对多、多对多)
- 主键/外键约束保证数据完整性
- 索引优化查询性能
- 根据读写比例选择存储方案
一句话建议:根据数据关系和访问模式选择合适的数据表实现方式。
然后呢
一张属性表、一张商品表。商品表里面有个属性 ID 字段关联属性。
方法一:一张属性表、一张商品表。属性表里面有个外键关联商品。不过这种方式每次都要 join 操作。如果还有其他表关联,以后会 join 越来越多的表。找数据很麻烦。
方法二:野方法。直接在商品表里面弄个属性字段,这个字段放一个 json 串来表示属性,这种方式每次只要查一种表,但是以后会越来越乱,不合适,可能适合一些小功能的实现吧。
下面是扩展性比较好的设计:
1. 商品类型表 - 这个表只保存商品类型本身的信息,例如英文名字,ID,中文名字等等
2. 商品类型可能有的属性表: - 这个表保存商品具备的所有属性,你可能还需要一个表来维护属性的"属性"(主要给开发用)
3. 商品和商品类型的对应关系表: - 商品和商品类型的对应关系。
3. 商品对应的属性值表: - 保存商品与属性值对应关系。
谢谢楼上几位,我再思考思考

