我是软件开发人员。我喜欢编写代码,但我讨厌数据库...目前,我正在创建一个网站,允许用户在该网站上将一个实体标记为喜欢(如FB中),对其进行标记和评论。
我在处理此功能的数据库表设计上陷入了困境。如果我们只能对一种类型的事物(例如照片)执行此操作,那么解决方案将是微不足道的。但是我需要为5种不同的功能启用此功能(现在,但我还假设随着整个服务的增长,这个数字可以增长)。
我在这里找到了一些类似的问题,但是没有一个令人满意的答案,所以我再次问这个问题。
问题是,如何正确,有效和弹性地设计数据库,以便它可以存储不同表的注释,喜欢不同表的注释以及它们的标签。一些设计模式作为答案将是最好的;)
详细描述:我有一个表 User
与一些用户数据,以及3个表:Photo
用照片,Articles
用文章,Places
用的地方。我想使任何登录的用户能够:
评论这三个表中的任何一个
将其中任何一个标记为喜欢
用标签标记其中的任何一个
我还想计算每个元素的点赞次数以及使用该特定标签的次数。
1 日的做法:
a)对于标签,我将创建一个表 Tag [TagId, tagName, tagCounter]
,然后我会创造很多一对多的关系表为:Photo_has_tags
,Place_has_tag
,Article_has_tag
。
b)评论数相同。
三)我将创建一个表 LikedPhotos [idUser, idPhoto]
,LikedArticles[idUser, idArticle]
,LikedPlace [idUser, idPlace]
。数喜欢将计算查询(其中,我认为是坏的)。和...
我真的不喜欢这个设计的最后一部分,对我来说很难闻;)
2 次的方法:
我将创建一个表ElementType [idType, TypeName == some table name]
,该表将由管理员(me)填充,并带有可被喜欢,注释或标记的表的名称。然后我将创建表:
a)LikedElement [idLike, idUser, idElementType, idLikedElement]
注释和标签的内容相同,每个注释都有正确的列。现在,当我想制作一张喜欢的照片时,我将插入:
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)
依此类推...我认为第二种方法更好,但是我也觉得这种设计也缺少一些东西...
最后,我还想知道存储该元素多少次的最佳计数器是哪个。我只能想到两种方式:
- 在element(
Photo/Article/Place
)表中 - 通过选择count()。
我希望我对这个问题的解释现在更加全面。