2012-10-06 125 views
2

我們正在計劃使用類似於該網站上實施的標籤系統。處理標籤

我們有實際的標記前端和自動完成等工作。

但我很困惑,因爲最好的方式來處理它的後端。

基本上,當我們得到我們最終得到一個數組,看起來像後臺標籤:

array(
    array(
    'value' => 1, 
    'label' => 'First Tag' 
), 
    array(
    'value' => 2, 
    'label' => 'Second Tag' 
), 
    array(
    'value' => 'Third Tag', 
    'label' => 'Third Tag' 
), 
    array(
    'value' => 3, 
    'label' => 'Fourth Tag' 
), 
) 

的標記插件也收到相同的陣列格式json_encode()「通過AJAX當d它自動填充,它顯示標籤,並存儲該ID,以便它可以將其發回。

因此,值爲1,2,3的標籤是從自動填充中選擇的標籤。
值爲Third Tag的標記是未從自動填充中選擇的標記,可能已存在於數據庫中,但可能尚未存在但已手動輸入。

現在有變化,用戶實際上可以創建恰好是數字的標籤,因此

array(
    'value' => 3, 
    'label' => 3 
) 

能來通過,但尚未存在,所以我們不能想當然地認爲,如果值是一個int然後它已經存在。

所以,這個問題的第一部分是,我如何管理這個,所以我沒有結束重複標籤?

我目前的做法是,當在標記插件通過自動填充請求標籤我發回的陣列等

(術語=「銷」)

array(
    array(
    'value' => '||1', 
    'label' => 'pink' 
), 
    array(
    'value' => '||4', 
    'label' => 'pin cushion' 
) 
) 

,然後在後端只是假設任何具有以||開頭的值的標籤來自自動完成並已經存在。

然後, 我們查詢所有標籤數據庫, 與我們檢查,看看是否在value存在數組的label鍵,如果它不,我們只是離開它是標籤的休息,如果它不」我們創建它,然後我們用原始數組中的新id轉換出該值。

但是,這對我來說很不好,這意味着我們正在使用填充項目(||),必須有一個更優雅的方式來做到這一點?

問題的下一部分是,實際上將這些標籤鏈接到一個項目。 這是更多在編輯本網站上的問題的情況下,

一些標籤已經鏈接到一個問題。你如何處理它,這樣你就不會在一個問題上得到重複的標籤引用?

到目前爲止,我看到兩個選項: 刪除問題中所有標籤的鏈接,然後再將其全部插入。(2個查詢)

查詢數據庫中與問題連接的所有標記,遍歷數組從數組中移除這些標記,然後插入餘數。 (2 queries)

是哪種方法比其他方法更好?還是有第三個版本?

回答

2

通過在相關字段中添加唯一約束,可以在數據庫級別解決任何類型的重複密鑰問題。所有與代碼交互的代碼都應該使用文本標籤來完成,該文本標籤應作爲標籤的唯一標識符。任何類型的數字ID對於應用程序本身都沒有任何用途,因此不需要從存儲庫層後面窺視。這也可以解決區分現有的/新的標籤......有效地,應用程序不關心它,它將標籤視爲持續的值對象而不是擔心任何種類的實體樣式生命週期。在標籤與文章相關聯的存儲庫調用中,如果標籤尚不存在,請創建該標籤。在執行標記查詢所需的JOIN(並且實際上並不在其他任何地方)時,ID將主要使性能更有利於性能,這也是應用程序不應該在存儲庫之外關注連接的情況。

更新標籤(包括刪除)的最安全和最簡單的方法是將現有標籤發出並寫入新標籤。這確保了持久狀態完全一致地匹配UI輸入,並且實際上這不會是昂貴的操作,也不會經常執行足以關心的事情(儘管通過簡單的程序檢查來查看是否需要更新會有助於防止不必要的寫入)。這是應該包裝在一個事務中的兩個查詢,並且可以一起進行批處理,並且只要適當的索引就位,DELETE尤其應該非常便宜,因此它不是您需要擔心的多種查詢類型。

如果出於某種奇怪的原因,您過分急於儘量減少數據庫的工作,您可以預先存儲一個版本的標籤,然後進行適合三角洲的查詢,但這種方法要脆弱得多,而且也可能引入許多複雜的併發問題。