简而言之,我认为关系型数据库更好,因为你正在考虑一件事与另一件事的关系,例如一个人有多少个团队的喜欢。你可以轻松地更新用户、团队或运动的元数据,而不用担心会破坏你的分析查询。此外,你可以轻松扩展添加诸如大学、高中等体育类型,而不必担心之前的设置可能会出问题。
但是,我必须承认我以前从未使用过图形数据库。 :)
进行关系型数据库可能会像这样:
我喜欢称之为信息表,因为它们仅提供有关特定项目的信息,有些人也称其为参考表:
Sport(Sport_ID,Sport_Name,[等等] ...)运动名称如足球,篮球等
示例视图:
╔══════════╦════════════╦═════╗
║ Sport_ID ║ Sport_Name ║ ... ║
╠══════════╬════════════╬═════╣
║ 1 ║ Football ║ ... ║
║ 2 ║ Basketball ║ ... ║
║ ... ║ ... ║ ... ║
╚══════════╩════════════╩═════╝
团队(Team_ID,Team_Name,Home_State,[等等] ...) - 团队将是所有团队,无论其所属的运动类型。
示例视图:
╔═════════╦═════════════╦═════╗
║ Team_ID ║ Team_Name ║ ... ║
╠═════════╬═════════════╬═════╣
║ 1 ║ Boca Junior ║ ... ║
║ 2 ║ River Plate ║ ... ║
║ 3 ║ Spurs ║ ... ║
║ ... ║ ... ║ ... ║
╚═════════╩═════════════╩═════╝
用户(用户ID,用户名,[等等]...)-- 所有用户特定信息都将在此处列出。示例视图:
╔═════════╦═════════════════╦═════╗
║ User_ID ║ User_First_Name ║ ... ║
╠═════════╬═════════════════╬═════╣
║ 1 ║ Mario ║ ... ║
║ 2 ║ Gabriel ║ ... ║
║ 3 ║ Juana ║ ... ║
║ 4 ║ Raul ║ ... ║
║ ... ║ ... ║ ... ║
╚═════════╩═════════════════╩═════╝
然后,您需要创建关系表来建立体育运动、团队和用户之间的联系。
Sports_Team(Sport_ID,Team_ID)- 在这里,您需要展示哪个团队参加了哪项运动。
示例视图:
╔══════════╦═════════╦═════╗
║ Sport_ID ║ Team_ID ║ ... ║
╠══════════╬═════════╬═════╣
║ 1 ║ 1 ║ ... ║
║ 1 ║ 2 ║ ... ║
║ 2 ║ 3 ║ ... ║
║ ... ║ ... ║ ... ║
╚══════════╩═════════╩═════╝
团队_用户_喜欢 (团队_ID, 用户_ID) -- 在此处,您需要展示哪些人喜欢哪些参与某项运动的团队。
示例视图:
╔═════════╦═════════╦═════╗
║ Team_ID ║ User_ID ║ ... ║
╠═════════╬═════════╬═════╣
║ 1 ║ 1 ║ ... ║
║ 2 ║ 2 ║ ... ║
║ 2 ║ 3 ║ ... ║
║ 3 ║ 3 ║ ... ║
║ ... ║ ... ║ ... ║
╚═════════╩═════════╩═════╝
现在,您只需执行以下操作即可获得用户喜欢的团队数量得分:
SELECT tul.User_ID
, COUNT(tul.Team_ID) AS Likes
FROM team_user_likes tul
GROUP
BY tul.User_ID
如果您想要用户元数据,比如他们的姓名,您可以将此查询投入到CTE中,然后使用用户表连接到CTE表。
这可能看起来很复杂,但它会使编辑/更新用户/团队/运动信息变得更加容易。您将能够做一些有趣的分析,比如使用喜欢的数据计算有多少用户喜欢/偏爱某个运动,而不必担心影响关系表,或者每种运动的哪个团队是最受欢迎的。
此外,这应该很容易扩展,具体取决于您使用的关系数据库。假设您想开始添加高中、大学等体育项目,您只需添加一个sport_type表,然后创建一个sport_sport_type关系表来建立哪些运动是职业运动或其他运动之一的联系。这样,您就可以按运动类型进行分析,而不必担心它如何影响您以前的设置。
我更喜欢关系数据库,因为它们似乎使事情更整洁。话虽如此,我从未使用过图形数据库。但考虑到您正在查看一件事与另一件事的关系,例如一个人喜欢多少个团队,我的意见是您应该选择关系数据库。
Person
节点可能具有连续的出站LIKES
关系链,否则应使用[:LIKE]
而不是[:LIKE*]
。2.由于(根据您的数据模型)查询不应为给定的一对Person
节点多次返回相同的r
列表,因此聚合值count(r)
很可能始终为1。 - cybersamCOUNT(DISTINCT r)
。但使用COUNT(*)
可能更清晰。 - cybersamJoin
和用Case
解决计算问题。 - Diez Gabriel