8

我知道这可能已被问过一百万次,但我找不到任何确定的东西。我正在制作一个涉及可以构建项目列表的用户的网站。我想知道将他们的项目存储在 SQL 表中的最佳方式是什么?

我在想我需要为每个用户制作一个单独的表,因为我看不到任何存储数组的方法。我认为这将是低效的。

4

2 回答 2

12

根据“项目”是什么,似乎有两种可能的解决方案:

  1. 用户和物品之间的一对多关系
  2. 用户和物品之间的多对多关系

如果可以将单个项目(例如“书”)“分配”给多个用户,则为 2)。如果每个项目都是唯一的并且只能属于单个用户,则为 1)。

一对多关系

create table users
(
   user_id    integer primary key not null,
   username   varchar(100) not null
);

create table items
(
   item_id    integer primary key not null,
   user_id    integer not null references users(user_id),
   item_name  varchar(100) not null
);

多对多关系:

create table users
(
   user_id    integer primary key not null,
   username   varchar(100) not null
);

create table items
(
   item_id    integer primary key not null,
   item_name  varchar(100) not null
);

create table user_items
(
    user_id   integer not null references users(user_id),
    item_id   integer not null references items(item_id)
);

由于您的描述非常模糊,这是我能想到的最好的。

不需要使用数组或类似的东西。看来您是数据库建模的新手,所以您应该阅读有关规范化的内容。每次您想到“数组”时,您可能都会想到“表”(或关系)。

编辑(刚刚看到你提到了 MySQL):
上面的 SQL不会在 MySQL 中创建外键约束(即使它会在没有错误的情况下运行),因为 MySQL 的愚蠢“我不会告诉你我不能做某事”态度。您需要单独定义外键。

于 2013-01-03T14:50:21.883 回答
0

最好为每个用户\帐户创建一个单独的表。这将限制必要表的大小并允许更快的搜索。当您呈现数据时,您通常会显示该当前用户/帐户的数据。当您必须通过表格搜索以查找相关信息时。随着依赖表的增长,应用程序将开始减慢。编写应用程序,就好像它将最大限度地使用 SQL。如果网站变得流行,这将限制未来重新设计的需要。

于 2014-01-08T20:11:04.007 回答