规范化数据库

时间:2012-06-19 08:16:33

标签: database normalization database-normalization normalize

我正在尝试构建一个小型Web应用程序。该应用程序用于存储书签及其标签。

书签:www.javaworld.com
标签:java,编程

书签:www.jquery.com

标签:java,webapps

现在我的搜索条件基于标签。如果用户搜索java,它应该给出他用java存储的所有书签。这里必须展示www.javaworld.com和www.jquery.com。

我的数据库表看起来像这样

用户(UID,Uname,密码)

书签(BID,UID,bookmark_url,tag1,tag2,tag3,tag4,tag5)

书签(BID,UID,书签)

标签(TID,BID,标记名)

这里BID和TID是代理键。

请考虑我给出的情景,建议更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:1)

为什么不在Stackoverflow上制作类似的东西?标签是“全局的”,不绑定到单个书签。 允许您定义标签而无需事先定义书签,从而提高了灵活性。同样限制在第一个解决方案中的5个标签也不是一个好主意。

如下所示将它们分开可以让您更好地运行聚合函数(制作标记云),并且您可以使用标记表在复选框中显示标记/更好地选择新书签。如果他们已经绑定到另一个书签,那会感到很尴尬。

Table: User [UID, Uname, PW]

Table: Bookmark [BID, UID, url]

Table: Tag [TID, Tagname]

Table: Bookmark_Tag [BID, TID]

答案 1 :(得分:0)

您的第一个解决方案存在以下问题:
- 您有固定数量的标签:用户如何为其书签定义第6个标签? - 您可能有许多NULL值:如果书签的标签少于5个,则其他列将不包含任何值。在这种情况下,您可能会浪费未使用列的内存 - 为了加快检索机制,您应该索引要执行搜索的列(在您的情况下为tag1,... tag5):您应该索引所有5个标记列。

由于这个原因,我建议你选择第二个解决方案,在Tags表中定义“Tagname”属性的索引。或者,作为替代方案,您可以包含一个Tag表,您可以在其中定义每个标记。在这种情况下,您的Tags表将通过使用标记的数字id(int)来引用Tag表。