如何允许您的代码存储不确定数量的列?

时间:2010-10-31 21:16:57

标签: php mysql database-design doctrine database-agnostic

我认为我的问题可能不清楚,但我会尝试通过例子解释它。

说我们有大约100种不同的汽车型号,显然所有汽车都会分享共同的部件或规格,但并非所有这些汽车品牌都能共享所有部件

在这种情况下存储这些规范的最佳做法是什么?

我的想法是在每列中存储最常见的规范,未确定(其余)规范可以保存或序列化为对象或数组。

doctrine通过这些数据类型(array-object)简化此操作 你认为这是个好主意还是请你与我分享你的经历

这是我在2个简单表格中的想法

Table 1
|-------|--------|-------|-------|-------|
| Id    | brand  |engine |desiel | blah..|
|-------|--------|-------|-------|-------|
| 1     | old car|   1.6 | yes   | blah..|
|-------|--------|-------|-------|-------|


Table 2 
|-------|--------|----------------------|
| Id    | car_id |  un common info      |
|-------|--------|----------------------|
| 1     |    1   |array of informations |
|-------|--------|----------------------|

我认为我的想法很糟糕,因为它破坏了搜索能力

5 个答案:

答案 0 :(得分:2)

如果您必须坚持使用MySQL,那么正如Paul和Netcoder所说,EAV将成为选择的解决方案。

除非仔细管理,否则EAV确实存在可扩展性问题,并且您的用例听起来好像可以通过Noch(非关系数据库)解决方案(如Couch或Mongo)更好地解决。

这些面向文档的数据库围绕着一个实体没有固定数量的字段的逻辑构建,例如产品,所有图像的数据都将存在于一个“文档”中。

答案 1 :(得分:1)

可能希望您需要Entity-Attribute-Value(EAV)架构。这些可以让您拥有包含不同信息量的记录,但查询起来可能很棘手。

答案 2 :(得分:0)

一个常用的解决方案是拥有一个接受键值对的表(通常称为EAV):

|-------|--------|-------|
| carId | name   | value |
|-------|--------|-------|
| 1     | engine | 4cyl  |
|-------|--------|-------|

答案 3 :(得分:0)

强制列数和类型肯定不可能吗?即使你允许一些模糊的?如果您可以确定列,则不需要复杂的解决方案。可能是最不痛苦的选择。只是一个想法。

答案 4 :(得分:0)

为每个唯一的属性组合使用一个表,但也将公共属性放入在具有这些属性的所有汽车类型之间共享的表中。我们的想法是确保描述汽车的每个可能的元组只能出现在模式中的一个位置。这个原则有一个名称:The Principle of Orthogonal Design