MySQL:使用一组列作为ID(SKU)

时间:2015-04-19 00:56:20

标签: php mysql laravel

我正在开发一个项目库存系统,并且在数据库设计方面存在一些问题。

我的inventory表列出了库存商品。 每个项目都是唯一的,并由"x-y-z"类型的SKU标识,xyz是我的表格字段。

例如:

+----------------------------------+
|x     |y     |z     |sku          |
+----------------------------------+
|10    |21    |xs    |10-21-xs     |
+----------------------------------+
|43    |1032  |xl    |43-1032-xl   |
+----------------------------------+
|73    |623   |l     |73-623-l     |
+----------------------------------+

我需要能够按SKU查找项目,但也需要返回给定xyz的行。

是否需要将skuxyz一起存储,因为sku是多余的?

如果有办法避免这种情况,我怎么能通过sku用这样的laravel找到物品:

Item::find(sku); //sku has to be primary key

谢谢你的时间!

4 个答案:

答案 0 :(得分:0)

是的,如果它是多余的,那么你不需要它。这个词本身意味着它。看看这个SQL:

SELECT * FROM inventory WHERE x||'-'||y||'-'||z = sku; 

sku是您正在寻找的价值。有时它因性能而仍然很好。

或者将字符串sku拆分并比较x,y,z。

答案 1 :(得分:0)

你也应该保存SKU,除非你确定x,y,z或SKU永远不会改变。

无论如何,您想要保存SKU(在列或单独的表中),在该单独的表中保存其他列(x,y,z),并通过自动递增INT来识别产品。 (有关here

的详细信息

示例:

产品:

id | the_rest_of_your_product_columns
_____________________________________
1  | ...
2  | ...

产品详情:

product_id | x | y | z | ...
____________________________
1          | 2 | 3 | 4 | ...

答案 2 :(得分:0)

如果您愿意,可以使用视图来定义x,y和z:

create table inventory (
    sku varchar(255) not null primary key
);

create view v_inventory as
    select sku, substring_index(sku, '-', 1) as x,
           substring_index(substring_index(sku, '-', 2), '-', 1) as y,
           substring_index(sku, '-', -1) as z
    from inventory;

然后,您可以访问使用x的{​​{1}}子句中的yzwhere值。

答案 3 :(得分:0)

对我而言,我会保留sku单独的列并将unique index添加到其中。您可以在migrations

中执行此操作
$table->unique('sku');

来源http://laravel.com/docs/5.0/schema#adding-indexes


通常Laravel会假设id是主要的列名。但是你可以通过将此代码放在模型中来覆盖它

class Staff extends Model {

  protected $primaryKey = 'sku';

}

来源http://laravel.com/docs/5.0/eloquent#basic-usage

覆盖后,您可以使用sku查找商品$item = Item::find(sku);