只想询问有关mysql的意见。 哪一个是更好的解决方案?
情形1: 存储在一行: -
PRODUCT_ID:1
attribute_id:1,2,3
当我检索数据时,我将字符串拆分为','
我看到了一些数据库,以这种方式存储数据,记录是产品,列是存储产品属性:一个:3:{S:4: “规格”;一个:2:{I:1; S:6: “黑”; I:3; S:2: “37”;} S:21: “spec_private_value_id”;一个:2:{I:1; S:11: “12367591683”; I:3; S:11: “12367591764”;} S:13: “spec_value_id”;一个:2:{I:1 ; S:1: “5”; I:3; S:2: “29”;}}
或
情况2: 存储在3排: -
PRODUCT_ID:1
attribute_id:1
PRODUCT_ID:1
attribute_id:2
PRODUCT_ID:1
attribute_id:3
这是正常的做法,为记录的属性存储3行。
在性能和空间方面,任何人都可以告诉我哪一个更好。从我看到的是 case1 节省空间,但需要在PHP(或其他服务器端脚本)中处理数据。 case2 更直接,但请使用空格。
答案 0 :(得分:1)
节省空间?真的吗?你说的是当1TB磁盘售价70美元时保存字节?
也许你甚至没有保存字节。如果将属性存储为“12234,23342,243234”,则对于3个属性,这类似于30个字节。如果你将它们存储为smallint,它们将占用6个字节。
答案 1 :(得分:0)
取决于属性是否对以后搜索很重要,例如。
如果您将属性作为序列化数组保存在一个字段中以防您实际上不关心它们并且例如您不需要运行查询来显示所有产品那么可能会很好有一个属性。
但是,如果您将属性设置为以逗号分隔(需要使用LIKE),并且将属性存储为序列化数组,那么查找具有一个属性的所有产品至少会“糟糕”,并且它们完全无法用于使用SQL查询进行任何排序或分组。
如果对产品和属性之间的多种关系使用单独的表格,那么如果它们对于选择/分组/排序其他数据非常重要,那就更好了。
答案 2 :(得分:0)
在案例1 中,虽然节省了空间,但是花费了很多时间来分割字符串。
您还必须注意字段的大小:如果您有50个具有2个属性的产品和1个具有100个属性的产品,则必须创建字段~varchar(200)...您根本不会节省空间。
我认为案例2 是最佳和推荐的解决方案。
答案 3 :(得分:0)
您需要考虑将使用这些值的SELECT语句。如果您希望搜索具有某些属性的记录,则将它们存储在单独的列中并对其进行索引会更有效。否则,您正在执行需要更长时间处理的“LIKE”语句。