我在下面定义了两个表。
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)进行零填充。现在,就我所知,整数不能用零填充存储。
我提出的解决方案是在故障单表中添加ticketID varchar(8)not null列,并将实际ID用于BOTH TABLES作为代理键。 ticketregistration表的外键将指向ticketid。
我的问题是关于效率和速度。以前我可以在系统中添加票证注册,数据库会在添加时执行完整性约束,以查看具有相同ID的票证是否在数据库中。现在我有一个要编入索引的id的varchar字符串 当客户“注册票证”时,更容易将票证表中的ticketid varchar保留在票证注册表(也是varchar(8))中使用ticketid的外键吗?
或者在ticketregistrations中没有ticketid varchar(8)会更容易,将ticket表的外键保留为ticketregistrations表的主键,并首先检查ticket表中的ticketid,检索值,并将其输入到票据登记中的一行?
这将在每次插入ticketregistrations表之前在ticket表上创建索引varchar搜索。
我的初始解决方案不需要这个,因为参照完整性可以解决问题。
我担心寻找时间。
答案 0 :(得分:1)
我有两个解决方案。
第一个是在票证表中有两列标识符。一个应该是一个仅内部标识符,用于引用(意味着你可以自动增加它)。关键点是该列不会与任何输入数据相关联。第二列将包含用户输入的id的字符串表示形式。然后,您可以在第二列上添加唯一索引以进行搜索。
第二种方法是保持表格不变,但只有显示具有零填充到指定长度的ID(即,用户只能输入6位数字)。所以无论你需要显示一个id,都要调用一个填充它的函数;输入票号时,剥离任何填充并转换为整数。如果您已经在问题中围绕数据库结构编写了整个应用程序,那么此解决方案将更容易实现。如果您认为在应用程序的生命周期内数字位数将是一个变量,它也会更灵活。
如果可行,您可以实现两个解决方案,向表中添加第二个数字列,然后执行零填充显示。
无论您最终使用哪种解决方案,如果要求您添加对包含字母和数字的故障单标识符的支持,请考虑您必须更改的内容。
答案 1 :(得分:0)
我会留下ids和外国的ley限制。添加第二个varchar计算列,并添加前导零。将第一列用于所有工作并显示第二列。