我是一名软件开发人员。我喜欢编码,但我讨厌数据库...目前,我正在创建一个网站,允许用户将实体标记为喜欢(如FB),标记和评论。
我被困在数据库表设计上来处理这个功能。解决方案是微不足道的,如果我们只能为一种类型的东西(例如照片)做到这一点。但我需要为5种不同的东西启用它(现在,但我也假设随着整个服务的增长,这个数字会增长)。
我在这里发现了一些类似的问题,但没有一个问题得到满意的答案,所以我再次提出这个问题。
问题是,如何正确,高效和弹性地设计数据库,以便它可以存储不同表的注释,喜欢不同的表和标签。一些设计模式作为答案将是最好的;)
详细描述:我有一个表 User与一些用户数据,以及3个表:Photo用照片,Articles用文章,Places用的地方。我想启用任何已登录的用户:
评论这3个表中的任何一个
将其中任何一个标记为喜欢
使用某个标记标记其中任何一个
我还想计算每个元素的喜欢次数以及使用特定标记的次数。
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],该表将由管理员(我)填充,其中包含可以被喜欢,评论或标记的表的名称。然后我将创建表:
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)表中
通过select count()。
我希望我对这个问题的解释现在更彻底。
婷婷同学_