2011-10-04 69 views
0

我很难试图形成我的实际问题,所以希望我可以通过视觉辅助获得重要的一点。MySQL - 优化列引用?

我想知道的是我目前的数据库设计是否存在可怕的缺陷,效率稍低或者......是否正确。

问:除了仅保存该列名称的字符串外,是否有更好的方式让行单元引用另一个表中的列?

例如: 有两个表。

table01:有3列 - C_ID,客户层(层保持层的在TABLE02列名)

TABLE02:具有5列 - i_id,项,等级1,层2,的Tier3

table01 +------+----------+------+ 
     |'c_id'|'customer'|'tier'| 
     +------+----------+------+ 
     | 1 | John  | tier1| 
     | 2 | Lisa  | tier2| 
     | 3 | Mike  | tier1| 
     | 4 | Tom  | tier3| 
     +------+----------+------+ 

table02 +------+------+-------+-------+-------+ 
     |'i_id'|'item'|'tier1'|'tier2'|'tier3'| 
     +------+------+-------+-------+-------+ 
     | 1 | apple| $1.99 | $2.99 | $3.99 | 
     | 2 | chalk| $2.99 | $3.99 | $4.99 | 
     | 3 | pens | $3.99 | $4.99 | $5.99 | 
     | 4 | shirt| $4.99 | $5.99 | $6.99 | 
     +------+------+-------+-------+-------+ 

结果:

John +------+-------+ 
     | apple| $1.99 | 
     | chalk| $2.99 | 
     | pens | $3.99 | 
     | shirt| $4.99 | 
     +------+-------+ 

选择约翰的行会产生等级1,这然后用于查询table02.tier1,并获取该列的内容。 (以第一级客户的折扣价格)。然后,tier1项目将以正确的价格显示。

是否有一种更有效的方式来引用外部表的列名称,比如......以外键风格?如果列名更改,那么该信息会跳转到其他链接的数据单元?我的方法是否正确,还是应该重组我如何做事?

+0

“table02”中的'i_id'是否与'table01'中的'c_id'结合?如果不是的话,你如何确定'table02'中的哪一行属于'table01'中的行? –

回答

1

这是不完全清楚的c_idi_id列应该如何使用,但更常规的设计是使用这样的设计:

table01 +------+----------+------+ 
     |'c_id'|'customer'|'tier'| 
     +------+----------+------+ 
     | 1 | John  | 1 | 
     | 2 | Lisa  | 2 | 
     | 3 | Mike  | 1 | 
     | 4 | Tom  | 3 | 
     +------+----------+------+ 

table02 +------+------+-------+ 
     |'i_id'|'tier'|'cost' | 
     +------+------+-------+ 
     | 1 | 1 | $1.99 | 
     | 2 | 1 | $2.99 | 
     | 3 | 1 | $3.99 | 
     | 4 | 1 | $4.99 | 
     | 1 | 2 | $2.99 | 
     | 2 | 2 | $3.99 | 
     | 3 | 2 | $4.99 | 
     | 4 | 2 | $5.99 | 
     | 1 | 3 | $3.99 | 
     | 2 | 3 | $4.99 | 
     | 3 | 3 | $5.99 | 
     | 4 | 3 | $6.99 | 
     +------+------+-------+ 

我编辑这个例子可以更好地说明我的想法。这真的不会改变你的答案。所以最好将层列合并为一列,并重复多次项目ID(i_id)数据?我把分层/成本结构分解为专栏的理由是减少冗余。这种方法是否需要我创建一个新表来索引外键的层次?

我明白你现在在做什么。在某个地方,您可能有一个'销售'表,它记录了一个c_idi_id,一个数量,一个日期和其他信息(如果每个销售包含一个项目;否则,你会有一个'订单'表和'OrderItems',并且c_id将与订单表关联,并且i_id将与订单项相关联,并且将存在连接这两个表的订单号)。

如果您将item说明添加到上面修订的table02,那么您将违反3NF。您应该有一个表格,例如i_iditem列。这将给项目号码命名。我建议的table02(也许是'TieredItemCosts')表将保持原样;主键是(i_id,tier)的组合。

+0

是的,我刚刚编辑了这个例子来更好地说明我的想法。这真的不会改变你的答案。 因此,最好将层列整合到一列中,并重复多次项目ID(i_id)数据? 我将层级/成本结构分解为列的理由是为了减少冗余。 该方法是否需要我创建一个新表来索引外键的层? – Squish

+0

我想你已经修正了它的结构。 HOW关系其实很简单。 C_ID是客户...客户可以有不同的价格水平,他们被收取...一个大型经销商可以有一个很大的折扣与一个occaisional卖家vs随机直接买家。也就是说,“ITEM”(I_id)中的任何产品都可以出售给客户,但在客户有权根据他们的“购买力”协议享有的层次级别上。 – DRapp

+0

@DRapp正确。这就是为什么我想知道如何构建关系。我目前的方法是否合适,还是乔纳森的方法会更好? – Squish