2012-07-29 38 views
1

我有以下问题:我在数据库中存储项目列表并在网页上显示它们。我需要为网页上的每个项目分配id或class。最直接的方法是分配与数据库中相同的ID。这里有一个例子:数据库ID和HTML 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始终是唯一的。

我确定人们在网页开发时经常碰到这个问题。我想知道是否有比上面的例子更好的处理方法。

回答

1

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


存放前缀id数据库:

  1. 表中的废物空间本质上是冗余数据。更大的数据实际上意味着“更小”的缓存。
  2. 既然你想搜索它,需要一个索引。这是一个索引此外id索引您不能再用于查询,但仍然需要强制唯一性。在所有情况相同的情况下,如果您的表是clustered*,则每个附加索引都会使INSERT/UPDATE/DELETE速度更慢并且可能会更加昂贵。并且还可以用作“大数据”,使缓存“更小”。

如果你的DBMS支持适当的机制**,你实际上并不需要物理存储领域 - 数据库管理系统可以计算出它的飞行对你来说,呈现点(1)无关。

但是,您仍然需要为它编制索引,因此第(2)点仍然相关。


*一些的DBMS甚至都不给你一个选择的关断集群(MySQL的/ InnoDB的)。

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

+0

我结束了你的建议,事实证明,这实际上很简单:在调用数据库时,在呈现html时将其移除时添加id。谢谢! – finspin 2012-07-31 20:37:07

0

直观地使用原始数据库ID似乎是一个糟糕的主意,因为您不能一次使用多个表而没有冲突的ID。答案只是决定一个明智的方法来将id重写为HTML的某些内容。一个可靠的方法是将表名和id连接起来,这意味着你不能有任何冲突的id。这样做的缺点是,您会将大量有关数据库的信息放入页面中,您可能会考虑安全问题。

+0

感谢您的评论。你提出一个关于原始ID不太好的主意,尽管现在不是一个问题,因为我只用一张表工作。如果我要添加更多表格,这可能会成为一个问题。 – finspin 2012-07-29 14:03:40

1

你肯定不应该在数据库中存储HTML标识。在渲染页面的位置添加前缀时会出现什么问题?当然,另一个明显的问题是为什么你需要为每个列表项元素分配一个不同的ID?

+0

我需要为每个列表项目分配不同的ID,因为我正在对这些项目执行一些jQuery效果,所以我需要能够通过某种ID识别每个项目。在渲染时添加前缀的问题又与jQuery(和Ajax)有关。我使用ajax从数据库中提取了一些额外的数据,因此列表项和数据库对象之间必须有一个公共标识符。我当然可以在执行ajax调用之前移除前缀,但这正是我试图避免的那种复杂情况。 – finspin 2012-07-29 13:59:51