Sqlalchemy
為方便範例,拆分具有多個欄位的表
為了方便起見,將具有多個欄位的表拆分為兩個部分是個好主意嗎?
真實例子:
class UserData(Base): __tablename__ = "users_data" id = Column(Integer, primary_key=True, index=True) age = Column(Integer, index=True) first_name = Column(String, index=True) last_name = Column(String, index=True) country = Column(String, index=True) city = Column(String, index=True) comment = Column(String, index=True) users_meta = relationship("UserMeta", uselist=False, back_populates="users_data") class UserMeta(Base): __tablename__ = "users_meta" id = Column(Integer, primary_key=True) email = Column(String, unique=True, index=True) hashed_password = Column(String) created = Column(DateTime(timezone=True), server_default=func.now()) last_visited = Column(DateTime(timezone=True)) is_active = Column(Boolean, default=True) user_data_id = Column(Integer, ForeignKey('users_data.id')) users_data = relationship("UserData", back_populates="users_meta")
因此,在一個表中只有 id 和有關使用者的數據,第二個表是元資訊。目前我不知道我將使用多少次以及哪些欄位會比其他更多。
還有一個額外的問題是,我是否需要創建第三個表,其中包含電子郵件和 id 之間的相關性,或者我可以在沒有它的情況下做到這一點?
PS我希望數據很容易理解,沒有標準SQL格式的翻譯
您提出的設計存在幾個問題。
從最簡單的問題開始:“年齡”列。像“年齡”這樣的屬性是依賴於基礎屬性的計算值。您必須將日期儲存在數據庫中的其他位置。我建議您在 SQL 語句中計算年齡或將其設置為虛擬列。
其次,user_meta 表中的事實似乎將幾個概念混合在一起:使用者身份驗證、帳戶資訊和聯繫資訊。考慮到這種組合,我猜你每個使用者只有一行——除非你允許使用者基於電子郵件地址創建多個登錄身份。如果您有一對一的關係,為什麼要將其拆分為兩個表?如果沒有關於您的案例的更多資訊,我實際上認為您需要 5 個表:使用者身份、物理地址、電子郵件地址、帳戶活動和密碼。
您提出的架構的資訊安全性很差。密碼應單獨儲存,以便您可以限制訪問並實施其他安全措施。同樣,您可能希望限制對電子郵件地址的訪問。
所以我的建議是查看所有使用者屬性並查看邏輯分組是什麼。考慮哪些資訊集具有一對一或多對一的關係。在進行分組時考慮安全方面。