【问题标题】:Best method to store multiple data for row为行存储多个数据的最佳方法
【发布时间】:2016-04-14 12:03:27
【问题描述】:

我正在考虑存储每个行可能不同的多个值的最佳方法。例如,我有一个产品和类别表。在项目开始时,一种产品被分配到一个类别。因此,您可以使用表 products 中的单个列将产品分配给类别。我认为将多个类别分配给同一产品会很好。

我脑子里有两个想法。

  1. 创建第三个表,其中包含 category_id 和 product_id 两列。
  2. 不要创建另一个表并为每个产品添加一个或多个具有类别名称、id 和 product_id 的重复行。

我的想法还可以吗,是否还有其他更优化的方法?

【问题讨论】:

  • 任何时候你发现自己试图在一个列中存储多个值,停下来,记住这样做违反了数据库规范化并采取相应的行动,就像你的第二点一样。
  • 第一点也不是在一个列中存储多个值。您如何看待将图像(URL)以序列化数组的形式保存在一列中?

标签: php mysql


【解决方案1】:

您描述了一个多对多关系。使用第三张桌子。这是一个常见的用例。像这样

products table
--------------
id
name
...


categories table
----------------
id
name
...


product_categories table
------------------------
product_id
category_id

那么你就可以像这样得到一个产品的所有类别

select c.name
from categories c
join product_categories pc on pc.category_id = c.id
join products p on pc.product_id = p.id
where p.name 'my product name'

【讨论】:

    【解决方案2】:

    根据juergen d 提供的应用程序、读取/写入次数等,您可以使用查找表来存储配对信息。

    如果您的类别集有限(64 或更少),那么您可以选择避免查找表的开销并使用SET 字段。它是非规范化的,但意味着您可以从单行中检索类别以及产品。

    然后您还可以进行按位比较以查找属于某个类别/类别集的产品,例如

    mysql> show create table products\G
    *************************** 1. row ***************************
           Table: products
    Create Table: CREATE TABLE `products` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(40) NOT NULL,
      `product_categories` set('a','b','c') DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `product_categories` (`product_categories`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> insert into products set name = 'product a', product_categories = 'a';
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into products set name = 'product b', product_categories = 'b';
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into products set name = 'product ab', product_categories = 'a,b';
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select id, name from products where product_categories & 1;
    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | product a  |
    |  3 | product ab |
    +----+------------+
    2 rows in set (0.00 sec)
    
    mysql> select id, name from products where product_categories & 2;
    +----+------------+
    | id | name       |
    +----+------------+
    |  2 | product b  |
    |  3 | product ab |
    +----+------------+
    2 rows in set (0.00 sec)
    
    mysql> select id, name from products where product_categories = 'a';
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | product a |
    +----+-----------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 谢谢。很高兴知道,但不幸的是,项目类别是由用户创建的。但它可以用于任何其他目的对我有用。所以非常感谢!
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多