一个数据库,多个客户

时间:2010-06-24 16:46:33

标签: php mysql database database-design doctrine

我目前正在编写一个产品,该产品只有一个数据库,但会使用customer_id的全局标识符来托管许多客户端。

这一切都非常好。

但是,假设我们有一个名为Ticket的表。 Idea有一个主键。当用户添加票证时,票证将通过外键等对应于客户

但是,对于每个客户,我希望他们的票证ID在他们注册时从1开始。

即。客户1添加4张票,ticket_id计数为4.客户2注册,他们添加票,然后ticket_id将是5,依此类推。哪个不理想。

我的问题是,如果我不想使用多个数据库,如何解决这个问题?每当我做出改变时,如果有数百个带有新列,索引等的数据库,那么必须更新的想法会让我非常恼火。

希望这是有道理的,我期待你的意见。

编辑:标记为symfony,因为我将在symfony中使用Doctrine ORM来管理数据库....可能无关紧要,但是为了以防万一而添加。

编辑:我可能也是愚蠢的,并且遗漏了一些明显的东西,所以我道歉。

7 个答案:

答案 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

(如果您没有数千名客户,这应该不是问题。)