我目前正在编写一个产品,该产品只有一个数据库,但会使用customer_id的全局标识符来托管许多客户端。
这一切都非常好。
但是,假设我们有一个名为Ticket的表。 Idea有一个主键。当用户添加票证时,票证将通过外键等对应于客户
但是,对于每个客户,我希望他们的票证ID在他们注册时从1开始。
即。客户1添加4张票,ticket_id计数为4.客户2注册,他们添加票,然后ticket_id将是5,依此类推。哪个不理想。
我的问题是,如果我不想使用多个数据库,如何解决这个问题?每当我做出改变时,如果有数百个带有新列,索引等的数据库,那么必须更新的想法会让我非常恼火。
希望这是有道理的,我期待你的意见。
编辑:标记为symfony,因为我将在symfony中使用Doctrine ORM来管理数据库....可能无关紧要,但是为了以防万一而添加。 编辑:我可能也是愚蠢的,并且遗漏了一些明显的东西,所以我道歉。答案 0 :(得分:3)
为什么不直接添加ticket_num列,并管理自己按顺序保留每个客户ID?如果您正在使用doctrine,请查看在Ticket模型中对preInsert方法进行处理。
答案 1 :(得分:2)
我是否理解每个客户的门票将从1开始按顺序列出?我将假设每个客户都有自己的门票,这些门票不会暴露给其他客户。你应该在你的问题中澄清这一点。
我建议在故障单表中创建一个新列以用作参考号(让我们称之为ref_num)。当客户端2创建票证时,ticket_id将为5,但您的应用程序将知道为该用户将ref_num分配给1。
为了使 正常工作,您需要找到一种方法来跟踪每个客户端创建的故障单数量。也许对于每个联系人,您可以拥有一个名为ticket_count的列,每次增加一个。这样,在您的应用程序中,您只需提取此数字并将其递增1即可更新您的计数并获得新的票号。
仅供参考,在这里我们不担心隐藏用户的信息。我们使用ref_num字段来隐藏用户的真实ID号。我们有多个部门,每个部门都有多个客户端,共享相同的ID池。如果A组创建票证23456,则B组创建另一票证,尽管前一票证不属于他们,但它显示为23457。票号不需要是连续的。
答案 2 :(得分:2)
另一种可能性是不使用连续的整数票证ID。您可以为票证加时间戳,甚至可以缩短到秒,并使用它。我工作的某些供应商也这样做。其他人跟踪计数并将其附加到时间戳,时间戳看起来是一个没有间隙的唯一数字,但实际上可能不会以这种方式实现。
在这种情况下,客户会看到像2010062407
这样的票号,并认为“显然与当天有关,甚至可能与时间有关”。但我不认为客户会说,“我如何获得20亿张故障单?!”
答案 3 :(得分:2)
在我看来,您混淆了主键和业务键的概念。主键的功能是唯一地标识表中的行,而不是其他任何内容。每当试图将意义附加到主键时 - 初始设计出现问题。
如果票号具有某些商业含义 - 以及预期的顺序 - 只需为每个客户配备一个序列生成器,并为其添加一列。
答案 4 :(得分:1)
创建一个名为CustomerTickets的新表,该表有两列customer ID和ticket id。 对于您的客户,请从表中读取客户ID的最后一个票证ID,将其递增,然后将其写入您在事务中累计的实际票证表中。
答案 5 :(得分:1)
我会说你应该按原样保留主ID,逻辑上它应该是内部的。您可以生成唯一标识符(GUID,时间戳),并可以将其用于显示目的。或者,您可以生成一个唯一的ID(用于显示目的),将第一个(例如4个)客户名称字母组合起来,然后将其填充为0。
类似的东西:
APPL000006
GOOG000004
使用它,修剪前四个字母,然后重新获得主要ID。
答案 6 :(得分:0)
您还可以尝试为每个客户创建额外的表格,因此您最终会为每个客户创建新表格 例如。表:
tickets_1 //all tickets for customer with id 1
tickets_3 //all tickets for customer with id 3
(如果您没有数千名客户,这应该不是问题。)