数据库设计设计类的最佳方法?

时间:2015-03-29 23:00:00

标签: sql database database-design logic relational-database

所以,我正在为一个简单的社交网络建模一个关系数据库,但我不确定我是如何设计关系的朋友,我对用户有以下关系:

User(id INTEGER PRIMARY KEY AUTOINCREMENT ASC, username TEXT NOT NULL UNIQUE, 
password TEXT NOT NULL)

起初我设计了这样的朋友关系:

Friend(user_id_parent INTEGER FK, user_id_child INTEGER FK,
PRIMARY KEY(user_id_parent, user_id_child))

但我尝试设计的方式中的朋友关系意味着如果A是B的朋友,那么B也是A的朋友。这样,当我插入新朋友时,最好的方法是什么?

  1. 每当我插入A是B的朋友时,我也插入B是A的朋友?
  2. 我只插入A是B的朋友,当我必须搜索朋友时,我会查看两列。

1 个答案:

答案 0 :(得分:0)

你几乎得到了它!我对你所说的做了一个小提示(稍微改一下,以便它可以与Sql Server一起使用,我实际上可以运行它) - http://sqlfiddle.com/#!6/d2330/1。 "朋友"被称为联结表(交替连接表,交集表)。您为每个友谊输入一个朋友(关系,交叉点)记录。这是一种非常常见的结构,尽管它经常用于非平等关系(学生:班级)以及平等关系(人:人)。 https://technet.microsoft.com/en-us/library/ms190651%28v=sql.105%29.aspx

您的选项1是真的 - 当您将记录插入Friend表时,它会自动插入两者的关系 - 您很可能不想创建两个记录。您的选项2也是如此 - 正如我小提琴中的第三个选项 - 它要求您查看两个列。

我确实提到了一些你没有提到的复杂性 - 关系类型。基本关系是朋友,但也可能有配偶,孩子,敌人等。如果卡尔是爱丽丝的孩子,反之则不然。但即便如此,您可能也不想创建两个连接记录。在显示关系时,您可能会以编程方式调整forvers。