何时需要在数据库中添加表以查找值

时间:2012-01-24 22:38:11

标签: performance database-design architecture relational-database database-schema

只是寻找关于何时使用查找值表的一般方向/最佳实践。假设我有一张包含交易/付款的表格,其中包含以下列:

交易

  • 的transaction_id
  • ORDER_ID
  • amount_paid
  • PAYMENT_STATUS
  • payment_type

好吧,让我们说payment_type可以是3个选项之一('信用卡','直接信用'或'国际汇款')。目前,对于每个表行,此payment_type字段将存储为文本。现在最好将此值存储为文本或为其创建查找表并将外键存储回事务表中吗?

E.g。

payment_type

  • payment_type_id
  • payment_type_name

交易

  • 的transaction_id
  • ORDER_ID
  • amount_paid
  • PAYMENT_STATUS
  • payment_type_id

现在我的想法是这个字段与Web应用程序紧密结合,因此如果将来添加更多支付类型,应用程序可能必须更改以适应它。将另一种付款类型添加为文本就好了,例如'paypal'或在查找表中添加另一个条目。各种支付类型可以存储在网络代码中的数组中。

我可以看到使用查找表的好处是数据库中的整体数据较少(存储密钥而不是文本)。缺点是查询可能稍慢,因为它必须对数据进行另一次连接?

那么这里的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

从性能角度来看,查找表在大多数数据库系统中基本上是免费的。如果SQL分析器/执行器足够小,它将在内存中加载整个查找表。

如果需要,可以轻松添加允许用户或管理员添加更多付款类型的功能。

答案 1 :(得分:2)

  

是必要的......

我会说在这种情况下最好使用查找表。

如果你有一个简单的活动/非活动或是/否列,你可以使用char(1)和一个检查约束或一点,但如果你代表任何更复杂的东西,最好有一个查找表。

然后,您可以将此表用于用户表单输入(填充选择框等)

这将使列变平并缩小,这将允许每页更多行,并帮助缓存主表的内存使用情况。

答案 2 :(得分:2)

当您需要a)限制列中值的范围时,使用“查找表”,以及b)在运行时更改值的范围。

  

目前,每个表行都存储了这个payment_type字段   作为文字。现在最好将此值存储为文本或进行查找   它的表并将外键存回到事务表中?

你似乎在混合两种不同且无关的想法。

  1. 使用“查找表”(我将其视为“表和外键约束”的简写)。
  2. 用ID号替换文字。
  3. 要创建“查询表”以限制“交易”表中“payment_type”的值范围,您可以执行此操作。

    create table payment_types (
      payment_type varchar (35) primary key
    );
    
    insert into payment_types
    select distinct payment_type
    from transactions;
    
    alter table transactions
    add constraint constraint_name
    foreign key (payment_type) 
      references payment_types (payment_type);
    

    当您谈论货币交易时,可能不希望级联更新或删除。巨大的,巨大的损害风险非常高。

    如果您想减少事务表的宽度,请考虑使用小的CHAR()代码而不是整数。人类可读的代码避免了连接。在你的情况下,我可能会使用'cc','dc'和'it'。但我只是在分析了所有已知的付款方式后才这样做。 (会计人员已知,不仅仅是数据库开发人员已知的,而不仅仅是您特定公司中使用的那些。)

    create table payment_types (
      payment_type_code char(2) primary key,
      payment_type_desc varchar(35) not null unique
    );
    

    如果CHAR(2)代码不能覆盖您的预期值,请使用整数,并支付联接的价格以获得人类可读的值。

答案 3 :(得分:1)

我发现使用参考表有几个好处:

  • 数据库可以应用完整性约束。没有人可以有意或无意地输入'Playpal'服务 - 除非他可以访问参考表。

  • 更容易分割各种应用程序(或部件)的访问权限。有些应用程序可以访问transcations表,只能访问引用表,其他(管理面板)也可以写入引用表。

  • transaction表的整体尺寸较小。

  • transaction表格的行尺寸较小。

  • 在这种特殊情况下,行大小也会保持不变。

  • 包含payment_type的各种指数现在包括payment_type_id,因此它们更小。

  • 之前的四个属性可能有助于更快的查询,而不是更慢,因为较小的表和索引大小意味着更多的数据可以留在内存中并且更长。