2009-09-14 65 views
0

我有两个表定义如下。索引变量和外键

Create table tickets (id long not null, 
reseller long not null, 
constraint pk_lock primary key (id)); 

Create table ticketRegistrations (id long not null, 
customer long not null, 
constraint fkTicketRegistrationTicket 
    foreign key (id) references tickets (id) on update cascade); 

客户端可以输入票据(因此不会自动增加主键)。由于id是ticketregistrations表的主键AND FOREIGN KEY,因此存在完整性约束和所有爵士乐。我遇到的问题是一个功能请求,它允许使用票证ID(即00070)进行零填充。据我所知,整数不能用零填充进行存储。

我想出了什么解决方案是在ticket表中添加一个ticketID varchar(8)not null列,并将两个表的实际id用作代理键。票证注册表的外键然后指向ticketid。

我的问题是关于效率和速度。以前,我可以在系统中添加票据注册,并且数据库会对添加进行完整性约束,以查看具有相同ID的票证是否在数据库中。现在我有一个varchar字符串作为将被索引的id。
当客户“注册票证”时,将ttytid varchar保留在票据表中并在票证注册表中使用ticketid的外键(也是varchar(8))会更容易吗?

或者在ticketregistrations中不存在ticketid varchar(8)会更容易,将ticket的外键保留为ticketregistrations表的主键,并首先检查ticket表中的ticketid,检索值,并将其输入到ticketregistrations内的一行中?

这将在每次插入ticketsregistrations表之前在票据表上创建索引varchar搜索。

我的初始解决方案并不需要这个,因为参照完整性处理了这个问题。

我很担心寻找时间。

+0

什么数据库系统,以及它的版本? – 2009-09-14 17:01:59

回答

1

我有两个解决方案。

第一个是在票据表中有两列用于标识符。一个应该是一个仅供内部使用的标识符,用于引用(意思是可以自动增加它)。关键是该列不会绑定到任何输入数据。第二列将包含由用户输入的id的字符串表示形式。然后,您可以在第二列添加一个唯一的索引用于搜索目的。

第二个是保持表格原样,但只有显示带零填充到指定长度的ID(即用户只能输入6位数字)。所以你需要显示一个ID的地方,调用一个填充它的函数;当输入票号时,去除任何填充并转换为整数。如果你的问题已经有了围绕数据库结构编写的整个应用程序,那么这个解决方案将更容易实现。如果您认为在应用程序的生命周期中数字的数量将是一个变量,它也更加灵活。

如果可行,您可以实现这两种解决方案,在表中添加第二个数字列,然后执行零填充显示内容。

无论您最终使用哪种解决方案,都要考虑如果您被要求添加对包含字母和数字的票证标识符的支持时必须更改的内容。

0

我会离开ids和外国ley约束,因为它们是。添加第二个计算列是varchar,并添加前导零。对所有工作使用第一列并显示第二列。