MySQL 5.5数据库设计。友好URL方法的问题

MySQL 5.5数据库设计。友好URL方法的问题,mysql,database-design,insert,relational-database,friendly-url,Mysql,Database Design,Insert,Relational Database,Friendly Url,我有一个可能很愚蠢的问题,但我需要问它:-) 我的友好URL(furl)数据库设计方法在下图中有相当的总结(InnoDBatMySQL 5.5used) 每个项目将产生尽可能多的furls语言在网站上可用。furl_重定向表表示每个项目的控制器路径。我举一个例子: item.id = 1000 item.title = 'Example title' furl_redirect = 'item/1000' furl.url = 'en/example-title-1000' furl.url

我有一个可能很愚蠢的问题,但我需要问它:-)

我的友好URL(furl)数据库设计方法在下图中有相当的总结(InnoDBatMySQL 5.5used)

每个项目将产生尽可能多的furls语言在网站上可用。furl_重定向表表示每个项目的控制器路径。我举一个例子:

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表中存在(必要的)唯一约束。如上所述,为了获得唯一的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表上获取下一个自动增量值? 你能想出另一种方法来确保友好URL的唯一性,它独立于项目的id吗?我错过了什么重要的东西吗

欢迎任何解决方案


谢谢

您可以在InnoDB中获得自动增量,请参阅。您是否应该使用它取决于您需要并能够实现的吞吐量。当用作主键时,任何自动递增/标识类型列都会创建一个“热点”,从而限制性能

另一种选择是使用字母数字ID,如bit.ly或其他URL缩写。这样做的好处是,您可以拥有使用基数36(a-z+0-9)而不是基数10的短ID。为什么这很重要?因为你可以使用一个随机数生成器从一个相当大的域中选择一个数字——6个字符可以得到20亿个组合。将数字转换为基数36,然后检查是否已分配此数字。如果没有,你有你的新ID,然后离开,否则生成一个新的随机数。这有助于避免热点,如果这对您的系统是必要的。自动增量比较容易,我会先尝试一下,看看它是否能在您预期的负载下工作


您还可以同时使用基本36 ID和自动增量,这样您的友好URL就会更短,这通常是关键所在。

您可以在InnoDB中获得自动增量,请参阅。您是否应该使用它取决于您需要并能够实现的吞吐量。当用作主键时,任何自动递增/标识类型列都会创建一个“热点”,从而限制性能

另一种选择是使用字母数字ID,如bit.ly或其他URL缩写。这样做的好处是,您可以拥有使用基数36(a-z+0-9)而不是基数10的短ID。为什么这很重要?因为你可以使用一个随机数生成器从一个相当大的域中选择一个数字——6个字符可以得到20亿个组合。将数字转换为基数36,然后检查是否已分配此数字。如果没有,你有你的新ID,然后离开,否则生成一个新的随机数。这有助于避免热点,如果这对您的系统是必要的。自动增量比较容易,我会先尝试一下,看看它是否能在您预期的负载下工作


你也可以使用基础36 ID和自动增量,这样你的友好URL就更短了,这通常是重点。

< P>你可以考虑其他方法来处理你的项目。 首先,您使用“en/”de/”等来更改语言。我可以问一下脚本是如何工作的吗?如果您有不同语言的不同文件夹,您的脚本和用户一定会受到很大影响。尝试使用gettext或任何其他本地化方法(取决于项目的大小)

关于友好url的。我最喜欢的方法是在项的表中只增加一列。例如:

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、随机数或计数(取决于您已经有多少相同的标题)

像这样存储alais之后,它非常简单。用户尝试访问

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

所以在您的脚本中,您只看到用户想要查看图片,以及别名为great holidays的图片。在数据库中找到它并显示它。

你可以考虑另一种方法来处理你的项目。 首先,您使用“en/”de/”等来更改语言。我可以问一下脚本是如何工作的吗?如果您有不同语言的不同文件夹,您的脚本和用户一定会受到很大影响。尝试使用gettext或任何其他本地化方法(取决于项目的大小)

关于友好url的。我最喜欢的方法是在项的表中只增加一列。例如:

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、随机数或计数(取决于您已经有多少相同的标题)

像这样存储alais之后,它非常简单。用户尝试访问

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

所以在您的脚本中,您只看到用户想要查看图片,以及别名为great holidays的图片。在DB中找到并显示它。

“实际上,您的系统整体上似乎不是很高效。”-可能值得回顾一下该评论,因为它可能被视为过于关键。你可能首先考虑回答这个问题,然后提供一些关于如何提高效率的反馈。好吧,我的坏消息,我不知道这里的人是敏感的:我没有说这是坏的,只是说可以考虑其他的方式。所以,如果可能的话,我会编辑它。很抱歉,“实际上你的系统整体上似乎不是很有效。”-可能值得回顾一下,因为它可能被视为过于苛刻。你可以考虑回答这个问题。