2012-06-19 61 views
0

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

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

书签:www.jquery.com

标签:java的,是webapps是基于标签

现在我的搜索条件。如果用户搜索的是java,它应该提供他用java存储的所有书签。这里必须显示www.javaworld.com和www.jquery.com。

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

用户(UID,UNAME,密码)

书签(BID,UID,BOOKMARK_URL,标签1,标签2,标签3,TAG4,tag5)

书签(BID,UID,书签)

标签(TID,BID,标记名)

此处BID和TID是代理键。

请提出更好的办法来解决这个问题考虑我给情景..

回答

1

为什么不做出类似像#2的东西吗?标签是“全球性”,并且不会绑定到单个书签。 允许您定义标签,而无需事先定义书签,这可以提高灵活性。同样限制为5个标签也不是一个好主意。

像下面这样分离它们可以让您更好地运行聚合函数(制作标签云),并且您可以使用标签表格更好地在复选框中显示标签/多选新标签。如果它们已经绑定到另一个书签,它会感到尴尬。

Table: User [UID, Uname, PW] 

Table: Bookmark [BID, UID, url] 

Table: Tag [TID, Tagname] 

Table: Bookmark_Tag [BID, TID] 
+0

感谢您的详细解释。将遵循这一点。 – sundeep

+1

数百万用户可以使用相同的书签URL - 我有第5个表将用户ID与书签ID配对,否则您可能让每个用户都复制www.ebay.com(这打破了规范化规则) – JM4

0

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

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