我正在开发一个项目库存系统,并且在数据库设计方面存在一些问题。
我的inventory
表列出了库存商品。
每个项目都是唯一的,并由"x-y-z"
类型的SKU标识,x
,y
,z
是我的表格字段。
例如:
+----------------------------------+
|x |y |z |sku |
+----------------------------------+
|10 |21 |xs |10-21-xs |
+----------------------------------+
|43 |1032 |xl |43-1032-xl |
+----------------------------------+
|73 |623 |l |73-623-l |
+----------------------------------+
我需要能够按SKU查找项目,但也需要返回给定x
,y
或z
的行。
是否需要将sku
与x
,y
,z
一起存储,因为sku
是多余的?
如果有办法避免这种情况,我怎么能通过sku用这样的laravel找到物品:
Item::find(sku); //sku has to be primary key
谢谢你的时间!
答案 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}}子句中的y
,z
和where
值。
答案 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);