【问题标题】:designing a follower/following schema between two tables in SQL?在 SQL 中的两个表之间设计一个追随者/追随者模式?
【发布时间】:2021-10-23 14:42:09
【问题描述】:

假设我们有两个表:

  • 品牌
  • 用户

我想设计一个系统:

  • 品牌可以追随品牌
  • 品牌可以关注用户
  • 用户可以关注品牌
  • 用户可以关注用户

这是我到目前为止所做的:

  • ed_id:被关注的user_id
  • er_id:关注者的user_id

注意:这两个表是不同的,但我没有写下所有的属性以保持简单

虽然这在用户中运行良好,并且我可以通过一些简单的查询返回每个用户的关注者,但我不知道如何在用户和品牌之间建立关系,以便他们可以相互关注。

感谢任何帮助!

【问题讨论】:

  • 您可以添加一个超级类型“Followers”。搜索“sql subtyping”很多信息可以找到。
  • 您的BrandsUsers 表看起来像存储同一实体实例的表。如果是这样,那么它们必须合并到一个表中,并且以下数据将是单个自引用(如果一个实例可能仅跟随一个实例)或联结表(如果一个实例可能跟随并被多个实例跟随)。
  • @Akina 我没有特意在 Brands 表中显示所有数据,否则两者之间存在很大差异。
  • 它不会改变任何东西。是否有任何理由将品牌和用户视为独立的实体?

标签: sql database-design


【解决方案1】:

有几种方法可以做到这一点。

似乎“用户”和“品牌”非常相似。它们共享许多属性 - 事实上,如果您将“brandname”和“username”替换为“name”,它们将是相同的。

这可能会引导您进行一系列不同的设计。

我你认为“实际上,有很多不同之处,我只是将它们排除在外以保持问题简单”,你可能会说有一个名为 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)

【讨论】:

  • 第一个案例对我有用!非常感谢。
【解决方案2】:

您可以基于下一个表架构:

-- 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)
);

Test SQL here

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2021-10-09
    • 2019-07-03
    • 1970-01-01
    • 2017-12-08
    • 2021-02-18
    • 1970-01-01
    • 2017-12-17
    相关资源
    最近更新 更多