簡體   English   中英

在數據庫中創建新記錄時客戶端發送的外鍵應該是什么?

[英]What should be the foreign key that the client sends when creating a new record in a database?

我正在使用 python、fastapi 和 postgresql 制作一個 web 應用程序。數據庫中有兩個相關實體:“部門”和“用戶”,具有一對多關系:

這些是學究式的模型:

# Shared properties
class UserBase(BaseModel):
    username: str | None = None
    email: EmailStr | None = None
    role: Roles | None = None

# Properties to receive via API on creation
class UserCreate(UserBase):
    username: str
    password: str
    role: Roles
    department_id: int # ???

因此,在應用程序中創建用戶時,必須發送指向用戶所屬部門的外鍵。 按照慣例,這個外鍵是部門的id(Pk),但是我想也許當客戶要創建一個新用戶時,他會很難記住他要關聯的部門的id它。 我該如何處理?

一種解決方案是讓客戶端指定部門名稱而不是id,然后在創建用戶之前使用該名稱在數據庫中查找部門id。

以下是如何修改 UserCreate model 以接受部門名稱而不是 id:

class UserCreate(UserBase):
    username: str
    password: str
    role: Roles
    department_name: str # instead of department_id

在用於創建用戶的 FastAPI 端點中,您可以先使用名稱查找部門 ID,然后使用該 ID 創建用戶:

@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):
    department = await db.fetch_one(
        """
        SELECT * FROM departments WHERE name = $1
        """,
        user.department_name,
    )
    if not department:
        raise HTTPException(
            status_code=400, detail=f"Department {user.department_name} not found"
        )
    department_id = department["id"]

    # create user with department_id
    ...

您是否偶然計划在您的 web 應用程序中使用 ORM,例如SQL Alchemy

如果是這樣,您可以 model 從他們的示例中找到您的解決方案。 此示例中的(許多)項目與用戶關系也可能是一個很好的指南。 與其他一些人相比,我對您的特定堆棧不太熟悉,但希望這會有所幫助。

我經常收到基於 API 的集成,我認為原始創建者實際上沒有考慮他們設計的依賴需求,代表您未來的 API 消費者 - 感謝您提前考慮到這一點:)

只是集思廣益,一般來說,當需要一個屬性時,在 API 設計中是合理的,但只要您有端點以允許您的 API 消費者查詢那些依賴實體,它是基於另一個表的查找值。 無論如何,您通常會在某種選擇列表中顯示您的部門。

我還看到開發人員依靠標簽或代碼(有點像水果和蔬菜上的 PLU 代碼)來快速創建、高度重復的 UI,用戶/員工在這些 UI 中接受過快速輸入值的培訓,並且可以輸入相關字段(在您的案例、部門),但它們在業務需求方面非常專業:比如零售庫存櫃台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM