在 SQL 中的两个表之间设计 follower/following 架构?
designing a follower/following schema between two tables in SQL?
假设我们有两个表:
- 品牌
- 用户
我想设计一个系统:
- 品牌可以关注品牌
- 品牌可以关注用户
- 用户可以关注品牌
- 用户可以关注用户
这是我目前所做的:
- ed_id: user_id 个已关注
- er_id: user_id 关注者
注意:两个表是不同的,但为了简单起见,我没有写下所有的属性
虽然这在用户中效果很好,我可以 return 每个用户的关注者有一些简单的查询,但我不知道如何在用户和品牌之间建立关系,以便他们可以关注每个用户其他.
感谢任何帮助!
有几种方法可以做到这一点。
看来“用户”和“品牌”很像。它们共享许多属性 - 实际上,如果将“品牌名称”和“用户名”替换为“名称”,它们将是相同的。
这可能会引导您进行一系列不同的设计。
我认为“实际上,有很多差异,我只是将它们排除在外以使问题简单化”,您可能会说有一个名为 User
的超类和两个名为 User
的子类Brand
和 Person
。 model inheritance in relational databases有几种方法。您可能会得到如下模型:
Users
-----
User_id (pk)
hashed_password
salt
phonenumber
address
Person
------
person_id (pk)
user_id (fk)
person_name
....
Brand
-----
brand_id (pk)
user_id (fk)
brand_name
....
Follow
-----
user_id_follower (fk)
user_id_followee (fk)
但是,您可能得出结论,“人”和“品牌”之间没有有意义的语义或行为差异 - 用户类型仅仅是该用户的一个属性.那样的话,生活会变得更轻松:
Users
-----
User_id (pk)
hashed_password
salt
phonenumber
address
name
user_type ('brand', 'person')
Follow
-----
user_id_follower (fk)
user_id_followee (fk)
您可以基于下一个表架构:
-- all entities table
create table followers (
id int primary key auto_increment,
follower_type enum('user', 'brand')
);
-- users data extention
create table users (
id int primary key,
user_name varchar(255),
foreign key (id) references followers(id)
);
-- brands data extension
create table brands (
id int primary key,
brand_name varchar(255),
foreign key (id) references followers(id)
);
-- following rules
create table follow_rules (
id int,
follow_to int,
unique key (id, follow_to)
);
假设我们有两个表:
- 品牌
- 用户
我想设计一个系统:
- 品牌可以关注品牌
- 品牌可以关注用户
- 用户可以关注品牌
- 用户可以关注用户
这是我目前所做的:
- ed_id: user_id 个已关注
- er_id: user_id 关注者
注意:两个表是不同的,但为了简单起见,我没有写下所有的属性
虽然这在用户中效果很好,我可以 return 每个用户的关注者有一些简单的查询,但我不知道如何在用户和品牌之间建立关系,以便他们可以关注每个用户其他.
感谢任何帮助!
有几种方法可以做到这一点。
看来“用户”和“品牌”很像。它们共享许多属性 - 实际上,如果将“品牌名称”和“用户名”替换为“名称”,它们将是相同的。
这可能会引导您进行一系列不同的设计。
我认为“实际上,有很多差异,我只是将它们排除在外以使问题简单化”,您可能会说有一个名为 User
的超类和两个名为 User
的子类Brand
和 Person
。 model inheritance in relational databases有几种方法。您可能会得到如下模型:
Users
-----
User_id (pk)
hashed_password
salt
phonenumber
address
Person
------
person_id (pk)
user_id (fk)
person_name
....
Brand
-----
brand_id (pk)
user_id (fk)
brand_name
....
Follow
-----
user_id_follower (fk)
user_id_followee (fk)
但是,您可能得出结论,“人”和“品牌”之间没有有意义的语义或行为差异 - 用户类型仅仅是该用户的一个属性.那样的话,生活会变得更轻松:
Users
-----
User_id (pk)
hashed_password
salt
phonenumber
address
name
user_type ('brand', 'person')
Follow
-----
user_id_follower (fk)
user_id_followee (fk)
您可以基于下一个表架构:
-- all entities table
create table followers (
id int primary key auto_increment,
follower_type enum('user', 'brand')
);
-- users data extention
create table users (
id int primary key,
user_name varchar(255),
foreign key (id) references followers(id)
);
-- brands data extension
create table brands (
id int primary key,
brand_name varchar(255),
foreign key (id) references followers(id)
);
-- following rules
create table follow_rules (
id int,
follow_to int,
unique key (id, follow_to)
);