Python中数据表设计问题如何解决?

比如商品,商品分好几种类型,不同类型有自己的独有属性,那么设计的时候两种方案:

1. 一个类型设计一张表

2. 一张表,然后有个类型字段,属性都放这个表里面


优劣比较:
1. 逻辑清晰,但是维护多张表会麻烦,比如修改删除会操作多张表

2. 只需对一张表操作,但是字段属性看着会比较乱


还需要考虑什么呢?如何取舍?
Python中数据表设计问题如何解决?

7 回复

属性要分表


对于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. 商品对应的属性值表: - 保存商品与属性值对应关系。

谢谢楼上几位,我再思考思考

回到顶部