【问题标题】:Help with Grocery List Database design帮助杂货清单数据库设计
【发布时间】:2011-09-20 19:33:39
【问题描述】:

我想创建一个接受类别和特定产品的杂货清单表。

例如:我添加到我的购物清单:

  1. 水果(类别)
  2. 富士苹果(产品)
  3. 洗发水(类别)
  4. Dove Energize 洗发水(产品)

我有带有制造商(参考表)的产品表,带有 SubCategoryId 的类别表。

我希望用户在杂货列表中输入类别或产品,但有办法知道输入的项目是类别或产品。请指教。

非常感谢任何帮助。

【问题讨论】:

    标签: sql-server database database-design relational-database database-schema


    【解决方案1】:

    Bogdan 解决方案是一个非常好的解决方案,如果我有您的问题,我会实施他的解决方案,但如果您坚持在一张表中的一列作为您的购物清单,我想您必须使用子字符串

    比如

    CREATE TABLE grocery_list (
        [groceryItem] varchar(100)
    );
    
    Insert into grocery_list ([groceryItem]) values ('(c)Fruit')
    Insert into grocery_list ([groceryItem]) values ('(p)Fuji Apple')
    Insert into grocery_list ([groceryItem]) values ('(c)Shampoo')
    Insert into grocery_list ([groceryItem]) values ('(c)Dove Energize Shampoo')
    

    并访问您的表子字符串前 2 个字符以检查您的项目的类型

    Select [item] = case when substring(groceryItem,2,1) = 'c' then
       right(groceryItem,len(groceryItem) - 3) +  ' (Category)'
    when substring(groceryItem,2,1) = 'p' then
       right(groceryItem,len(groceryItem) - 3) +  ' (Product)'
    end 
    from grocery_list
    

    这将为您提供以下结果

    **item**
    Fruit (Category)
    Fuji Apple (Product)
    Shampoo (Category)
    Dove Energize Shampoo (Category)
    

    【讨论】:

      【解决方案2】:

      我会创建两个单独的列,一个用于类别,一个用于产品:

      CREATE TABLE grocery_list (
          'category_id' INTEGER NULL FOREIGN KEY categories 'id',
          'product_id' INTEGER NULL FOREIGN KEY products 'id',
          ...
      );
      

      条目只会在两列之一中放置一个值,而将另一列保留为 NULL。然后你可以像这样查询你的购物清单:

      SELECT * FROM grocery_list, categories, products
          WHERE categories.id=grocery_list.category_id
          AND products.id=grocery_list.product_id;
      

      【讨论】:

      • 如果每条记录的 category_id 或 product_id 都保证为 NULL,那么该查询不会永远返回任何结果吗?我可能忘记了过时的无 JOIN 语法。
      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多