我是个软件开发人员。我喜欢编码,但我讨厌数据库... 目前,我正在创建一个网站,用户将被允许标记为 喜欢(如在 FB) ,标签它和 评论的实体。
为了处理这个功能,我在数据库表设计方面遇到了困难。解决方案是微不足道的,如果我们能做到这一点只为一种类型的事情(如照片)。但是我需要为5个不同的事情启用它(现在,但是我还假设随着整个服务的增长,这个数字可以增长)。
我在这里发现了一些类似的问题,但是没有一个答案是令人满意的,所以我再问一遍这个问题。
问题是,如何正确地、 有效率和 有弹性设计数据库,使其能够存储不同 桌子、 喜欢和 标签的注释。一些设计模式作为答案将是最好的;)
详细描述 :
我有一个 桌子 User
与一些用户数据,和3个以上的 桌子: Photo
与 照片,Articles
与 物品,Places
与 地方。我想让任何登录的用户:
评论这三张表中的任何一张
把他们中的任何一个标记为喜欢的
给他们中的任何一个贴上标签
我还想计算每个元素的“喜欢”数以及使用该特定标记的次数。
1斯特方法 强 > :
A)对于 标签,我将创建一个 桌子 Tag [TagId, tagName, tagCounter]
,然后我将创建 多对多关系 桌子: Photo_has_tags
,Place_has_tag
,Article_has_tag
。
B)评论也是一样的。
C)我将创建一个 桌子 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)
等等... 我认为第二种方法更好,但我也觉得在这个设计中缺少了一些东西..。
最后,我还想知道哪一个最好的地方存储柜台多少次的元素是喜欢。我只能想到两个办法:
Photo/Article/Place
)表我希望我现在对这个问题的解释更加全面。