2009-12-05 40 views
3

我想知道在以下情況下是否存在通用數據庫結構。自用戶上次看到以來發生更改的徽章/標記內容

在我的網絡應用程序中,有用戶和項目。

現在,每當一個項目創建或修改的,也沒見誰所有用戶新的/修改的項目還必須以某種方式被通知(例如,在項目名稱或東西的前面有一個圖標)

有沒有一個通用的方法呢?如果是這樣,那麼這個方法是什麼?如何以最有效的方式做到這一點?

回答

3

對於「什麼用戶已經看過什麼項目」而言,看起來像一個多關係的關係,最好用一個只有兩列的表實現 - 一個外鍵插入用戶表,一個插入到項目表中。創建項目時,您尚未向此表中添加條目(除非您可以將某個用戶標識爲被視爲已經看到該項目的創建者,在這種情況下,您確實添加了該條目) - 添加條目(U,P)每次出現「用戶U看到項目P」時。當一個項目被修改時,你刪除表中關於該項目的所有條目(同樣,除了可能修改的用戶,如果你知道是誰)。

需要此表的架構的SQL和我在文字中列出的操作?

編輯:一個評論者所請求的SQL,故(假設INNODB,MySQL中的情況下),假設表用戶和項目具有INT主鍵uid和PID分別爲:

create table Seen (uid int, pid int, 
        foreign key uid references user(uid) on delete cascade, 
        foreign key pid references project(pid) on delete cascade, 
        primary key (uid, pid)) 

當現有項目與p的pid被修改,所以現在沒有用戶被認爲已經「看到」它,delete from Seen where pid=P(即,從該表中刪除所有P的條目);如果修改是由用戶U進行的,則用戶U實際上被視爲已經看到它,您可以將and uid!=U添加到deletewhere子句中。

爲了紀念某一個用戶現在ü看到項目P,insert ignore into Seen(uid, pid) values (U, P)(該ignore部分的意思是「做什麼,如果該行已經在那裏」的事實,使錄製「看見」的條件不止一次是無害的,儘管當然是多餘的)。

+0

我說去了,更多的信息永遠是一件壞事 – 2009-12-05 17:17:28

+0

的感謝! SQL會很好,但我認爲我可以處理它:) – Bundy 2009-12-05 17:22:27

0

我會做的是創建某種「通知」實體(表)。然後,您可以讓您的數據庫客戶端代碼在有人添加新項目時插入新通知。或者你可以在數據庫本身自動使用triggers

具體如何設計通知(需要哪些表和哪些屬性)取決於應用程序的設計。

0

也許類似

 
users_viewed_projects 
+--------+-----------+ 
+ userId | projectId | 

添加一個條目,以該表的用戶名/專案編號一旦其被用戶觀看。

1

您需要一個表格顯示每個用戶上次看到每個項目的時間(如果有的話)。

create table user_seen_project 
(
user_id int, 
project_id int, 
last_seen datetime 
); 

對於每個項目,您需要上次更改時間。

create table project 
(
    project_id int 
    ... 
    last_changed datetime 
); 

然後,你可以做右外連接爲當前用戶,這樣

select project_id, /* other fields*/ last_changed, last_seen 
from project p outer join user_seen_project up 
on p.project_id=up.project_id 
where up.user_id=$currentUser 

在結果集:

  • 時last_seen爲空 - 用戶還沒有看到這個項目(新項目)
  • 時last_seen < last_changed - 更新項目
  • 當last_seen> last_changed - 'old'項目
0

您想要將版本列添加到您的項目表。然後,無論您引用用戶有權訪問哪些項目,都可以添加一列以顯示用戶使用的項目的最新版本。

現在,每當你填充有關用戶及其項目的信息,您可以檢查的項目當前版本號的用戶最後一個版本號,如果出現了這個項目的變化你就會知道它。

當然,這確實造成一些開銷。一旦他們注意到更新,您將不得不更新項目的用戶版本號,並且每次更改項目時,都需要增加版本號。正如kigurai所提到的,你可以使用觸發器來自動化一些。

1

希望這是不言自明的。

userproject_model_01

+0

謝謝!偉大的職位! – Bundy 2009-12-08 16:35:13