2012-03-11 87 views
3

這可能是一個愚蠢的問題,但我總是想知道做到這一點的最佳方式是什麼。設計類來表示數據庫表的最佳實踐

假設我們有兩個表的數據庫:UsersOrders(一個用戶可以有多個訂單),並在任何OOP語言有兩個類來表示這些表UserOrder。在數據庫中,很明顯'訂單'將具有'用戶'ID,因爲它是一對多關係(因爲一個用戶可以有很多訂單),並且用戶不會有任何訂單ID。但是在代碼中,以下三種中最好的做法是什麼?

a)用戶是否應該有一組訂單?
b)訂單是否應該有用戶ID?
c)訂單是否應該引用用戶對象?

還是有更有效的方法來解決這個問題嗎?我一直以不同的方式做到這一點,他們都有優點和缺點,但我從來沒有問過專家的意見。

在此先感謝!

回答

1

在這種情況下,如果您在用戶上執行操作(也涉及他們擁有的訂單),則用戶可以擁有一組訂單。

每當我設計我的類時,相關的對象都包含指向對方的指針,所以我可以從訂單中訪問用戶和用戶的訂單。

我不相信有一個最佳實踐,因爲它實際上取決於你想要完成的。通過用戶和訂單,我可以看到你從訂單開始,需要訪問用戶,反之亦然;因此,在你的情況下,你聽起來應該以兩種方式映射對象。

一個警告字,只是要小心不要創建一個循環引用。如果刪除兩個對象而不刪除引用,則可能會造成內存泄漏。

0

您在詢問什麼是「對象關係映射」(ORM)。我認爲學習你想學習的最好方法是看看一些已經建立好的ORM庫[比如ActiveRecord(Ruby)或者Hibernate(Java)],看看它們是如何實現的。

考慮到這一點:

a)如果應用程序需要它應該有訪問通過用戶對象表示用戶訂單對象數組(或類似的枚舉)。然而,這通常最好涉及延遲加載(即,當用戶從數據庫中拉出時,通常不會從數據庫中提取訂單......當應用程序需要訪問它們時,訂單將隨後被查詢)。在對象延遲加載之後,可以通過ORM對它們進行緩存,以消除對該爭用的進一步查詢的需求。 b)除非出於表現的原因,否則您只需拉取特定的欄位,在下單時通常會拉出所有欄位。所以它會包含用戶標識。

c)答案a也適用於此。