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 表的主键和外键,因此存在完整性约束和所有爵士乐。我遇到的问题是一个功能请求,它允许使用票证 ID(即 00070)进行零填充。据我所知,现在整数不能用零填充存储。

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

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

或者在ticketregistrations中没有ticketid varchar(8)会更容易吗,将ticket表的外键保留为ticketregistrations表的主键,并首先检查ticket表中的ticketid,检索值并输入它在ticketregistrations 中排成一排?

这将在每次插入ticketregistrations 表之前在tickets 表上创建索引varchar 搜索。

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

我担心寻找时间。

4

2 回答 2

1

我有两个解决方案。

第一个是在票表中为标识符提供两列。一个应该是仅限内部的标识符,用于引用(意味着您可以自动递增它)。关键是该列不会与任何输入数据相关联。第二列将包含用户输入的 id 的字符串表示形式。然后,您可以在第二列上添加唯一索引以进行搜索。

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

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

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

于 2009-09-14T16:17:27.983 回答
0

我会保留 ids 和 foreign ley 约束。添加第二个计算列,即 varchar 并让它添加前导零。将第一列用于所有工作并显示第二列。

于 2009-09-14T18:28:59.917 回答