【发布时间】:2011-12-28 02:37:26
【问题描述】:
我是一名软件开发人员。我喜欢编码,但我讨厌数据库...目前,我正在创建一个网站,允许用户在该网站上将实体标记为 like(就像在 FB 中一样),tag 它和评论。
我陷入了处理此功能的数据库表设计中。解决方案是微不足道的,如果我们只能对一种类型的事物(例如照片)执行此操作。但我需要为 5 种不同的东西启用此功能(目前,但我也假设随着整个服务的增长,这个数字会增长)。
我在这里发现了一些类似的问题,但没有一个有令人满意的答案,所以我再次问这个问题。
问题是,如何正确、高效和弹性地设计数据库,以便它可以存储不同表的cmets,likes 用于不同的 tables 和 tags。一些设计模式作为答案将是最好的;)
详细说明:
我有一个 table User 有一些用户数据,还有 3 个 tables:Photo 有 照片,Articles 有 文章,Places 与地点。我想让任何登录的用户:
评论这三个表中的任何一个
将其中任何一个标记为喜欢
用一些标签标记它们中的任何一个
我还想计算每个元素的点赞数以及使用该特定标签的次数。
1st 方法:
a) 对于tags,我将创建一个table Tag [TagId, tagName, tagCounter],然后我将创建many-to-many 关系表格:Photo_has_tags、Place_has_tag、Article_has_tag。
b) cmets 的计数相同。
c) 我将创建一个表 LikedPhotos [idUser, idPhoto]、LikedArticles[idUser, idArticle]、LikedPlace [idUser, idPlace]。 likes 的数量将由 queries 计算(我认为这是不好的)。还有……
我真的不喜欢最后一部分的这种设计,它对我来说很难闻;)
2nd方法:
我将创建一个表ElementType [idType, TypeName == some table name] 将由管理员(我)使用可以喜欢、评论表的名称填充该表/em> 或标记。然后我会创建tables:
a) LikedElement [idLike, idUser, idElementType, idLikedElement] 和 Comments 和 Tags 相同,每个都有适当的列。现在,当我想制作一张喜欢的照片时,我会插入:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
对于地方:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
等等……我认为第二种方法更好,但我也觉得这个设计也缺少一些东西……
最后,我也想知道在哪个位置存储元素被点赞次数的计数器最好。我只能想到两种方法:
- 在元素 (
Photo/Article/Place) 表中 - 通过选择 count()。
我希望我现在对这个问题的解释更彻底。
【问题讨论】:
-
你考虑过 XML 吗?
-
新手可以考虑像 neo4j 这样专为处理复杂连接而设计的图形数据库。
标签: mysql database design-patterns database-design