【问题标题】:MySQL 5.5 Database design. Problem with friendly URLs approachMySQL 5.5 数据库设计。友好 URL 方法的问题
【发布时间】:2011-07-12 08:09:18
【问题描述】:

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

My Friendly URL (furl) 数据库设计方法在下图中得到了相当的总结(InnoDBMySQL 5.5 使用过)

每个项目将生成与网站上可用的语言一样多的毛皮。 furl_redirect 表表示每个项目的控制器路径。我给你举个例子:

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吗?我错过了什么重要的东西吗?

欢迎任何解决方案!

谢谢!

【问题讨论】:

    标签: mysql database-design insert relational-database friendly-url


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可能会考虑另一种方式来处理您的项目。 起初,您使用 "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、随机数或计数(取决于您已经拥有多少相同的标题)。

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

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

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

      【讨论】:

      • “实际上你的整个系统看起来效率并不高。” - 可能值得审查该评论,因为它可能被视为过于挑剔。您可以考虑先回答问题,然后提供一些关于如何提高效率的反馈。
      • 好吧,我的错,我不知道这里的人很敏感:) 我没有说这很糟糕,只是说可能会考虑另一种方式。所以,如果可能的话,我会编辑它。对不起大家
      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 2018-10-08
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多