1

我有以下问题:我将项目列表存储在数据库中并将它们显示在网页上。我需要为网页上的每个项目分配 id 或 class。最直接的方法是分配与数据库中相同的 id。这是一个例子:

数据库

ID  |  Name
----+-----------
1   |  Apple
2   |  Orange
3   |  Banana

HTML

<ul>
  <li id="1">Apple</li>
  <li id="2">Orange</li>
  <li id="3">Banana</li>
</ul>

明显的问题是 HTML id 不能以数字开头。所以我想给 id 一个前缀,例如:

<ul>
  <li id="f1">Apple</li>
  <li id="f2">Orange</li>
  <li id="f3">Banana</li>
</ul>

但这会在 HTML 和数据库之间造成不一致,并使处理对象更加复杂。为了解决这个问题,我必须在数据库中添加一个新列:

ID  |  Name     |  HTML_ID
----+-----------+---------
1   |  Apple    |  f1
2   |  Orange   |  f2
3   |  Banana   |  f3

这似乎也不是理想的解决方案,因为现在我每次添加新项目时都需要手动将 HTML_ID 输入到数据库中。而且我需要确保 HTML_ID 始终是唯一的。

我相信人们在进行 Web 开发时经常会遇到这个问题。我想知道是否有比上面的示例更好的方法来处理这个问题。

4

3 回答 3

1

id在将其放入 HTML之前即时添加前缀,并在搜索数据库之前删除前缀。在更清洁的数据库和更清洁的代码之间进行选择时,请选择更清洁的数据库。


存储前缀id数据库:

  1. 浪费表中的空间来存放本质上是冗余的数据。更大的数据实际上意味着“更小”的缓存。
  2. 既然要搜索它,就需要一个索引。这是您不能再用于查询的索引之外的索引,但仍是强制唯一性所必需的。id在所有条件相同的情况下,每个额外的索引都会使 INSERT/UPDATE/DELETE 变慢,并且如果您的表是聚集的*则可能会更加昂贵。并且也有资格作为“更大的数据”,使缓存“更小”。

如果您的 DBMS 支持适当的机制**,您实际上不需要物理存储该字段 - DBMS 可以为您即时计算它,从而使第 (1) 点无关紧要。

但是,您仍然需要对其进行索引,因此第 (2) 点仍然相关。


*一些 DBMS 甚至没有让您选择关闭集群 (MySQL/InnoDB)。

**如计算列可以被索引或被索引的VIEW。

于 2012-07-30T09:24:05.093 回答
1

您当然不应该在数据库中存储 HTML id。在呈现页面时添加前缀有什么问题?当然,另一个明显的问题是为什么需要为每个列表项元素分配不同的 id?

于 2012-07-29T13:40:24.097 回答
0

从直觉上看,使用原始数据库 id 似乎是个坏主意,因为在没有冲突 id 的情况下,您不能一次使用多个表。答案只是决定一种明智的方式将 id 重写为 HTML 的内容。一种可靠的方法是将表名和 id 连接起来,这意味着您不能有任何冲突的 id。这样做的缺点是您将大量有关数据库的信息放入页面中,您可能会认为这是安全问题。

于 2012-07-29T13:39:03.713 回答