我有以下问题:我在数据库中存储项目列表并在网页上显示它们。我需要为网页上的每个项目分配ID或类。最直接的方法是分配与数据库中相同的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不能以数字开头。所以我想给ids一个前缀,例如:
<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始终是唯一的。
我确信人们在进行网络开发时会经常遇到这个问题。我想知道是否有更好的方法来处理这个问题,而不是上面的例子。
答案 0 :(得分:1)
您当然不应该在数据库中存储HTML ID。在渲染页面时添加前缀有什么问题?当然另一个显而易见的问题是为什么你需要为每个列表项元素分配一个不同的id?
答案 1 :(得分:1)
在将id
放入HTML之前添加前缀,并在搜索数据库之前删除前缀。在清洁数据库和清洁程序代码之间进行选择时,请选择清洁数据库。
存储前缀id
数据库:
id
上的索引,您不能再使用该索引进行查询,但仍然需要强制执行唯一性。在所有条件相同的情况下,如果表格为clustered * ,则每个附加索引都会使INSERT / UPDATE / DELETE变慢并且可能会非常昂贵。并且还有资格作为“更大的数据”,使缓存“更小”。如果您的DBMS支持适当的机制 ** ,您实际上不需要物理存储该字段 - DBMS可以为您实时计算它,使得点(1)无关紧要。
但是,您仍然需要对其进行索引,因此第(2)点仍然相关。
* 有些DBMS甚至不会让您选择关闭群集(MySQL / InnoDB)。
** 例如可以索引或索引的计算列VIEW。
答案 2 :(得分:0)
直观地使用原始数据库ID似乎是个坏主意,因为在没有冲突的ID的情况下,您不能同时使用多个表。答案就是决定将id重写为HTML的合理方法。一种强有力的方法是连接表名和id,这意味着你不能有任何冲突的ID。这样做的缺点是您将大量有关数据库的信息放入页面中,您可能会将其视为安全问题。