如果已经提出这个问题,请提前道歉,但我真的不知道如何搜索我遇到的问题。
我正在开发一个酒店预订和预订管理系统,旨在与多个客户合作,并且预计一些客户将有不同的要求,其中包括超出预订回复表中标准的其他字段(名称,地址,电子邮件,邮政编码等。
为实现这一目标,我创建了一个“选项”字段,用于将这些附加字段及其伴随值存储为序列化数据。但是,客户希望可以搜索这些字段。虽然这是可能的,但这显然不是存储需要搜索的数据的最佳方式。
此外,该表是MySQL中的InnoDB格式。
关于我唯一能想到的就是将这些额外的字段移到一个单独的表中,但这给预订的阅读和写作过程带来了很多挑战。
为了搜索的目的,存储这种不规则数据的最佳方法是什么?
答案 0 :(得分: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)
);
绝对不是很好,但它是解决问题的有效方法。
答案 1 :(得分:0)
如果在阅读该表时你并不总是需要的话,我可能会把它分成一个自己的表,即,你是否曾经查询过这个表而没有返回这个字段?
如果你确实选择将它保存在同一个表中,那么就没有理由你不能在其上放置索引,但这样可以在不将数据拆分为逻辑块的情况下尽可能加快搜索速度(你可以如果它可以是“任何东西”)。请注意,添加索引会增加写入时间,同时减少读取时间(因此,请勿在读取频率高于读取或写入时间更敏感的系统中执行此操作)。
答案 2 :(得分:0)
您的问题实际上不是数据库问题,而是如何在单个程序中支持多个客户端及其需求的问题。
您需要决定的第一件事是在程序的单个实例中是否支持多个客户端,或者每个客户端是否都有自己的实例。
如果每个客户端都有自己的实例,那么您可以单独维护公共代码库,并根据需要自定义每个客户端的实例。可能需要一些计划来生成一个系统,在该系统中,对公共代码库所做的更改会被自定义版本正确继承,但最终每个客户端都会完全他们想要的内容。
如果您采用多租户方式,那么您需要事先决定 每个客户端能够自定义其系统的确切程度。然后,您可以在数据库和应用程序结构中进行自定义。在最简单的层面上,这允许每个客户端将其识别信息和徽标存储在某个地方的表格中(可能是他们自己的CSS链接,以真正为应用程序提供自定义外观)。
在“额外字段”的情况下,可以通过多种方式处理。一种是简单地在有问题的表上放置10个额外的VARCHAR字段,并允许每个客户端根据需要“命名”这些字段(可能使用TYPE说明符,如果需要,应用程序将使用它来强制VARCHAR数据)。但是,在用户界面中适当地显示了他们命名的许多列(带有正确的提示)。这种方法的好处是,一旦设置,您将无需为每个客户做任何额外的工作。
另一种方法是允许每个客户端有一个额外的1对1表来存储额外的字段。在这种情况下,您可以正确地命名和键入数据库中的字段。缺点是,在允许客户自由选择这些字段的范围内,您必须修改您的用户界面以“了解”每个客户。