2011-03-26 29 views
3

管理每個用戶的阻止用戶的最有效方法是什麼,以便他們不會出現在PHP/MySQL運行的站點上的搜索結果中?跟蹤MySQL數據庫中每個用戶的「被阻止的用戶」的最有效方法是什麼?

這是我目前做的方式,我有一種感覺,這是不是最有效的方法:

創建的是它和獨特的用戶ID的更新他們的主要用戶表中的每個用戶一個BLOB每個用戶他們阻止。因此,如果用戶ID 313,563和732被用戶阻止,他們的BLOB只包含「313,563,732」。然後,無論何時爲該用戶查詢搜索結果,我都會包含BLOB內容,例如「AND UserID NOT IN(313,563,732)」,以便阻止的用戶ID不會顯示給該用戶。當用戶「解鎖」某人時,我從他們的BLOB中刪除該用戶ID。

有沒有更好的方式做到這一點(我敢肯定有!)?如果是這樣,爲什麼它更好,你的建議有什麼優點和缺點?

謝謝,我明白了!

+1

+1爲了清楚說明,使用示例。 – Smandoli 2011-03-26 12:20:46

回答

1

您正以一種不理解的方式將關係保存在關係數據庫中。你不會有外鍵等的利益

我推薦的方式做這將是有一個單獨的表被阻止的用戶:

create table user_blocked_users (user_id int, blocked_user_id); 

然後,當你要過濾的搜索結果,你可以簡單地用一個子查詢做到這一點:

select * from user u where ?searcherId not in (select b.blocked_user_id from user_blocked_users where b.user_id = u.id) 

您可能要開始了這種方式,然後使用查詢,高速緩存或其他東西,如果neccessary優化 - 但做最後一次。首先,建立一個可以使用的一致且正確的數據模型。

一些這種做法的利弊:

  1. 你將擁有區塊關係
    • 隨着外鍵的正確數據模型 ,你一定要讓你的數據模型一致

該方法的缺點:

  1. 在你的情況下,沒有,我可以看到

你的做法的利弊:

  1. 這將是緩慢的,不可擴展,如斑點被搜索binarily並沒有索引
  2. 你數據模型將難以維護,您將無法獲得外鍵
1

您正在查找交叉參考表。

您有一個包含用戶ID和「阻止」用戶ID的表,那麼你SELECT blockid FROM blocked WHERE uid=$user,你有被阻止的用戶ID的列表,您可以通過一個where子句過濾現在如WHERE uid NOT IN(SELECT blockid FROM blocked WHERE uid=$user)

你可以阻止每個用戶的多個用戶,並且以相反的速度阻止實際的數據庫。

0

您目前使用的是不被視爲關係數據庫設計的良好實踐,然而,就像其他任何情況一樣,有些情況下這種方法可以證明是合理的,儘管在您可以完成的任務方面存在限制。

你可以做的是像J V建議的那樣創建一個包含用戶關係映射的交叉引用表。這使得您可以跳過不必要的查詢,利用表索引,最重要的是,它可以爲您提供更大的靈活性。例如,您可以在表格中添加一個字段,指示關係的類型/狀態(例如,阻止,朋友,待批准等),這將允許更容易開發更復雜的系統。

1

您正在尋找以多對多關係連接的第二張表。檢查這篇文章:
Many-to-Many Relationships in MySQL

「優點」是很多。您正在以參照完整性處理您的數據,這在道路上具有無法估量的優勢。您所描述的問題將會在您的應用程序中被其他人所遵循,其中一些將比這個更難以管理。

的「缺點」是

  1. 你必須要學會如何參考數據工作(但是這是未來,無論如何,就像我說的)
  2. 你將有更多的表處理(同上)
  3. 您將不得不學習更多關於CRUD的知識,這很難......但只是包裝的一部分。
相關問題