在SQL表中存储项目数组

时间:2013-01-03 14:41:22

标签: sql arrays

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

我想我需要为每个用户创建一个单独的表,因为在那里我看不到任何存储数组的方法。我认为这样效率会很低。

2 个答案:

答案 0 :(得分:10)

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

  1. 用户与商品之间的一对多关系
  2. 用户与商品之间的多对多关系
  3. 如果单个项目(例如“书籍”)可以“分配”给多个用户,则为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的愚蠢“我不是在告诉你我是不是可以做某事”的态度。您需要单独定义外键。

答案 1 :(得分:0)

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