Mysql在列

时间:2017-01-16 23:17:53

标签: mysql sql list

我有一个名为userAccounts userProfiles和usersearches的表。

每个userAccount可能有多个配置文件。每个用户可能有很多搜索。 我有db设置使用它。但是,在每次搜索中,可能会有多个用户配置文件。

即,每个用户帐户可能拥有其家庭成员的个人资料。 然后,他们想要搜索并在搜索中包含他们的全部或部分家庭成员。我喜欢它的工作方式是在用户搜索中有一列称为配置文件,并且基本上有一个包含在该搜索中的profileID列表。 (但据我所知,你不能在sql中这样做)

我能想到的唯一方法就是有10个名为profile1,profile2 ... profile10的列,并将每个profileid放入列中,0或null放在未使用的空间中。 (但这显然是凌乱的)

1 个答案:

答案 0 :(得分:0)

创建 name1 ... nameN 形式的列明显违反了Zero, One or Infinity Ruledatabase normalization。任意地拥有其中的十个并不是正确的方法,这种假设在大多数情况下将被证明是非常慷慨或过于拘束。由于您使用的是关系数据库,请尝试相关地存储数据。

考虑架构:

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
  name VARCHAR(255),
  UNIQUE KEY index_on_name (name)
);

CREATE TABLE profiles (
  id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
  user_id INT NOT NULL,
  name VARCHAR(255),
  email VARCHAR(255),
  KEY index_on_user_id (user_id)
);

通过它,您可以根据需要创建零个或多个配置文件记录。您还可以在不影响主用户记录的情况下在配置文件记录中添加或删除字段。

如果您想搜索与用户关联的所有个人资料:

SELECT ... FROM profiles
  LEFT JOIN users ON
    users.id=profiles.user_id
  WHERE users.name=?

使用简单的JOIN或子查询,您可以轻松地实现这种关系。