我正在设计一个简单的推特网站(用于研究)但有一点不同:用户可以关注其他用户,关键字和列表。我想知道如何创建下表来放置有关关注的信息。
这种方法(下方)是否正确?
下表:
id ( id of the following table )
type ( type can be 1 ( user ), 2 ( keyword ) or 3 ( list ) )
idtype ( id of the type table )
user ( user's id )
但是没有关键字表格。所以我不知道。
最好的方法是什么?
答案 0 :(得分:1)
这是不正确的,因为您无法从idtype
创建外键到父表,因为“父表”会根据type
而更改。顺便说一句,如果用户可以关注多个关键字,那么你就不会为此有一个单独的表(除非你想break the 1NF将几个值“打包”到同一个字段中,这是一个非常糟糕的主意。
有几种方法可以解决这个问题,可能最简单的方法是为每个可能的父表使用单独的id
字段,然后约束它们,这样只有其中一个可以是非NULL。 / p>
但是,由于InnoDB tables are clustered和群集表中的二级索引很昂贵,我宁愿选择这样的东西(推文表未显示):
这将使您能够非常有效地回答查询:“哪些用户遵循给定用户(或关键字或列表)”。如果您需要回答:“给定用户遵循哪些用户(或关键字或列表)”,请反转上面显示的PK中的字段顺序。如果你需要两者,那么你需要两个方向的索引(并支付聚类价格)。