簡體   English   中英

MySQL 5.5 數據庫設計。 友好 URL 方法的問題

[英]MySQL 5.5 Database design. Problem with friendly URLs approach

我有一個可能很愚蠢的問題,但我需要問它:-)

我的 Friendly URL (furl) 數據庫設計方法大致總結在下圖中(使用了MySQL 5.5InnoDB

圖表

每個項目將生成與網站上可用的語言一樣多的毛皮。 furl_redirect 表代表每個項目的 controller 路徑。 我給你看一個例子:

item.id = 1000
item.title = 'Example title'
furl_redirect = 'item/1000'
furl.url = 'en/example-title-1000'
furl.url = 'es/example-title-1000'
furl.url = 'it/example-title-1000'

插入新項目時,還必須插入其 furl_redirect 和 furls。 問題的出現是由於 furl 表中的(必要的)唯一約束。 如您在上面看到的,為了獲得唯一的 url,我使用項目的標題(不一定是唯一的)+ id 來創建唯一的 url。 這意味着插入行的順序應該如下:

1. Insert item -- (and get the id of the new item inserted) ERROR!! furl_redirect_id must not be null!!
2. Insert furl_redirect -- (need the item id to create de path)
3. Insert furl -- (need the item id to create de url)

我想要一個優雅的解決方案來解決這個問題,但我無法得到它!

有沒有辦法在 InnoDB 表上獲取下一個 AutoIncrement 值?是否建議使用它? 你能想出另一種方法來確保獨立於項目 ID的友好 url 的唯一性嗎? 我錯過了一些重要的東西嗎?

歡迎任何解決方案!

謝謝!

您可以在 InnoDB 中獲得自動增量,請參見此處 是否應該使用它取決於您需要和可以實現的吞吐量。 任何自動增量/標識類型的列,當用作主鍵時,都會創建一個“熱點”,從而限制性能。

另一種選擇是使用字母數字 ID,例如 bit.ly 或其他 URL 縮短器。 這樣做的好處是您可以擁有使用基數 36 (a-z+0-9) 而不是基數 10 的短 ID。為什么這很重要? 因為您可以使用隨機數生成器從一個相當大的域中挑選一個數字 - 6 個字符可以獲得 20 億個組合。 您將數字轉換為基數 36,然后檢查您是否已經分配了此數字。 如果沒有,你有你的新 ID 並關閉你 go,否則生成一個新的隨機數。 如果您的系統需要這樣做,這有助於避免熱點。 自動增量更容易,我會先嘗試一下,看看它是否在您預期的負載下工作。

您還可以同時使用基本 36 ID 和自動增量,以便您的友好 URL 更短,這通常是重點。

您可能會考慮另一種方式來處理您的項目。 起初,您使用 "en/" "de/" 等來更改語言。 請問它在腳本中是如何工作的? 如果您有不同語言的不同文件夾,您的腳本和用戶必須遭受很多痛苦。 嘗試使用 gettext 或任何其他本地化方法(取決於項目的大小)。

關於友好的網址。 我最喜歡的方法是在項目表中只多出一列。 例如:

Table picture
id, path, title, alias, created
Values:
1, uploads/pics/mypicture.jpg, Great holidays, great-holidays, 2011-11-11 11:11:11
2, uploads/pics/anotherpic.jpg, Great holidays, great-holidays-1, 2011-12-12 12:12:12

現在在腳本中,在插入項目時,從標題創建別名,檢查別名是否已經存在,如果存在,您可以添加 id、隨機數或計數(取決於您已經擁有多少相同的標題)。

在你像這樣存儲阿萊斯之后,它非常簡單。 用戶嘗試訪問

http://www.mywebsite.com/picture/great-holidays

因此,在您的腳本中,您只會看到該用戶想要查看圖片,以及別名為 great-holidays 的圖片。 在數據庫中找到它並顯示它。

暫無
暫無

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

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