cakephp mysql,autoincrement id或varchar作为主键

时间:2014-02-06 05:48:04

标签: mysql sql cakephp

我正在使用cakephp 2.4构建一个Web应用程序,我首先使用整数自动递增ID设计我的users表,而不是因为我的url结构为:http://mywebsite/users/view/username我意识到不是使用整数auto -increment,使用username(VARCHAR 100)作为我的主键可能会更好。现在我很好奇这种方法在数据库增长时如何影响站点性能。

3 个答案:

答案 0 :(得分:1)

不要将varchars用作主键。性能太可怕了,你需要明确检查你没有重复的密钥,这不是常规的,外键需要是varchar,路由器不能正确处理它......呃。

如果你担心SEO,那么你可以阅读the cakePHP router can handle this的方式。

在我的应用程序中,我动态生成一个路径文件,其中的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),则会自动将该用户视图的所有链接更改为新网址。

答案 1 :(得分:1)

根据其他答案,请为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'));

并接受view函数中的'username'var,并使用它来从db中查找正确的用户。另请注意,如果

答案 2 :(得分:0)

varchar2 创建为主键并不好,我认为最好使用auto-incremental作为int,并且可以在cakephp中使用路由:http://book.cakephp.org/2.0/en/development/routing.html

http://yourwebsite.com/:username

祝你好运