簡體   English   中英

cakephp mysql,自動增量id或varchar作為主鍵

[英]cakephp mysql ,autoincrement id or varchar as primary key

我正在用cakephp 2.4構建一個Web應用程序,並且首先用一個整數自動遞增的id設計了我的用戶表,而由於我的URL的結構為: http://mywebsite/users/view/username我意識到,與其使用一個整數自動增量,使用用戶名(VARCHAR 100)作為我的主鍵可能對性能更好。現在我很好奇這種方法在數據庫增長時將如何影響站點性能。

不要使用varchars作為主鍵。 這對性能來說太可怕了,您需要顯式檢查您是否沒有重復的密鑰,這不是常規的,外鍵則需要為varchar,路由器將無法正確處理它。

如果您擔心SEO,則可以閱讀CakePHP路由器如何處理此問題

在我的應用程序中,我動態生成一個帶有seo url的路由文件,該文件與我要顯示的事物的ID相匹配。 在您的情況下,該文件將具有以下條目:

Router::connect('/users/view/johndoe', array(
            'controller' => 'users',
            'action' => 'view',
            13));

該解決方案對我來說效果很好,並且seo部分由附加到模型的SEO行為處理。 它也適用於反向路由,因此當您進行如下鏈接時:

<?php echo $this->Html->link(__('View'), array('action' => 'view', $user['User']['id'])); ?>

它將自動創建一個類似於/ users / view / johndoe的鏈接。 如果您決定稍后更改此結構,或擁有一個具有特殊路徑的特殊用戶(例如http://mywebsite.com/user-john-connor ),則這會將指向該用戶視圖的所有鏈接自動更改為新URL。 。

根據其他答案,請為您的PK使用一個整數。 根據您期望的記錄數量來選擇正確的int大小。 不對Cake使用整數PK可能會導致一些問題。 如果您使用的是框架,請遵循其約定-這就是框架的優勢!

不要在您的routes.php中為每個用戶動態生成唯一的路由。 這與具有通用路由的整個觀點背道而馳。 一種方法應該解決這個問題,您可以在相關控制器中進行處理。

例如,如果您指定所有實際控制器/動作:

Router::connect('/:controller', array('controller' => 'user|anotherController|etc'));
Router::connect('/:action', array('controller' => 'something'), array('action' => 'allowed|actions|etc'));
Router::connect('/:action', array('controller' => 'else'), array('action' => 'allowed|actions|etc'));

然后,您可以將其他所有內容(例如site.com/username)發送到特定位置。

Router::connect('/:username', array('controller' => 'users'), array('action' => 'view'), array('pass'=>array('username'), 'username' => 'regex'));

並在視圖函數中接受“ username”變量,並使用該變量從數據庫中查找正確的用戶。 另外請注意,如果

創建varchar2作為主鍵不是很好,我認為最好將它與int一起使用,並且可以在cakephp中使用路由: http : //book.cakephp.org/2.0/en/development/routing.html

成為:http: //yourwebsite.com/ : username

祝好運

暫無
暫無

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

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