2011-09-27 137 views
0

如果已经提出了这个问题,可以提前道歉,但是我真的不知道如何搜索我的问题。在MySQL中存储“不规则”数据

我正在开发一个酒店预订和预订管理系统,旨在与多个客户合作,并且预计一些客户会有不同的要求,其中包括预订回复表单中标准之外的其他字段姓名,地址,电子邮件,邮政编码等等)。

要做到这一点,我已经创建了一个存储这些附加字段和随之而来的值作为序列化数据的“选项”字段。但是,客户希望这些字段是可搜索的。虽然这是可能的,但这显然不是存储需要搜索的数据的最佳方式。

此外,有问题的表是MySQL中的InnoDB格式。

关于我能想到的是移动这些附加字段到一个单独的表中的唯一的事,但呈现给预订的阅读和写作过程中有很多挑战。

什么是存储此类不规则数据以进行搜索的最佳方式?

+2

“但呈现给预订的阅读和写作过程中有很多挑战。”?加入?这些“挑战”是什么? –

+0

重新编写大量的代码,并且具有行为在所有客户端保持一致,无论他们使用额外的字段或没有。 –

+1

如果“重新编写大量的代码”是你的问题的一部分,那么你等了太久,要求设计建议。 –

回答

0

您的问题并不是真正的数据库问题,而是一个如何在单个程序中支持多个客户端及其需求的问题。

你需要决定的第一件事是是否多个客户端将你的程序的单个实例中得到支持,或者每个客户端是否有自己的实例。

如果每个客户都有自己的实例,那么你可以单独维护共同的代码库,并根据需要自定义每个客户的实例。可能需要一些计划来生成一个系统,其中对通用代码库所做的更改被定制版本正确地继承,但最终每个客户端将得到他们想要的正好

如果您正在采取多租户方式,那么您需要提前决定每个客户将能够定制他们的系统的确切程度。然后在数据库和应用程序结构中提供该定制。在最简单的层面上,这允许每个客户端将他们的标识信息和徽标存储在某个表格的某个表格中(可能是他们自己的CSS链接,以便为应用程序定制外观)。

在“额外域”的情况下,这可以通过多种方式来处理。一个是简单地放在桌子上10个多VARCHAR领域的问题,并让每一个客户“姓名”这些领域,因为他们认为合适的(可能与你的应用程序将使用如果需要的话要挟VARCHAR数据类型说明符)。然而,在用户界面中适当的位置显示了许多他们命名的列(使用正确的提示)。这种方法的好处是,一旦建立起来,你就不需要为每个客户做额外的工作。

另一种方法是,让每一个客户有一个额外的1比1个与表,用于存储多余的领域。在这种情况下,您可以正确命名和键入数据库中的字段。缺点是,如果您允许客户自由选择这些字段,您必须修改用户界面以“了解”每个客户端。

+0

“您需要决定的第一件事是在程序的单个实例中是否支持多个客户端,或者每个客户端是否都有自己的实例。” 这是我与客户讨论过的情况,以防客户(客户)的需求超过应用程序明智的支持能力。 –

+0

正确的版本控制确实可以帮助保持这些应用程序同步。选择一个非常适合合并的SCM – Evert

1

一种选择是使用键值表。分开存储密钥,例如:

CREATE TABLE keys (
    id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    keyName VARCHAR(100) 
); 

CREATE TABLE values (
    key_id INT(11) UNSIGNED NOT NULL, 
    customer_id INT(11) UNSIGNED NOT NULL, 
    value VARCHAR(100) 
); 

肯定仍然不是很好,但它是对您的问题的有效解决方案。

+0

是的,我喜欢这个主意。我认为这个想法有其优点。 –

0

我想它,如果它的东西,你不会总是需要读取表时,即,你有没有查询该表,而不返回本场可能分离出它自己的表?

如果您确实选择将其保留在同一个表中,则没有理由不能在其上放置索引,但这会尽可能地加快搜索速度,而不会将数据拆分为逻辑块(您不能,如果它可以是“任何东西”)。要警告的是,添加索引会增加写入次数,同时减少读取次数(所以不要在系统中写入次数多于读取次数或写入次数更多时间敏感)。