MySQL/PHP:数据库布局,排序和搜索


MySQL/PHP: Database Layout, Sorting, and Searching

在我的网站上,我为我服务的成员提供了一个联系人数据库,他们可以在其中存储他们所有的联系人。这个数据库应该更适合成员。在输入联系人时,它询问所有标准问题,如姓名和头衔,然后将它们存储在表contacts中。然后是其他字段,如电话,地址,电子邮件和网站。但是联系人可以是这些的数倍,所以我希望我的成员可以无限制地进入。为此,我为每个字段、contacts_phone, contacts_address, contacts_email, contacts_website创建了一个表,每一行都有id、父行和数据。

这使得我很难进行适当的搜索。连接这些额外字段的唯一方法是通过parent,它持有连接到的接触的ID。它还会导致一些其他漏洞和错误,所以我决定抛弃这个想法,并认为这是一个失败。

现在我决定限制成员最多输入每个字段的10倍。所以在表contacts它现在有数百列(phone_1_data, photo_2_data, phone_3_data等),只是看起来混乱和错误。这样搜索、排序和交互会容易得多,但这似乎不是最好的方式。

对于任何自定义列,添加一个简单的键-值表,其中包含联系人ID、字符串键和字符串值。您可以使用它来匹配任意数量的任意自定义字段与联系人,并且它们将使用JOIN s保持可搜索性。

CREATE TABLE `custom_fields` (
    `contact_id` INT,
    `key` VARCHAR(63),
    `value` VARCHAR(255)
);

获取联系人的所有额外字段:

SELECT `key`, `value` FROM `custom_fields` WHERE `contact_id` = ?

在特定自定义字段中搜索具有特定值的联系人:

SELECT `contact`.* FROM `contacts`
JOIN `custom_fields` ON `custom_fields`.`contact_id` = `contacts`.`contact_id`
WHERE `custom_fields`.`key` = ? AND `custom_fields`.`value` = ?

或者,在任何自定义字段中查找具有特定值的联系人:

SELECT `contact`.* FROM `contacts`
JOIN `custom_fields` ON `custom_fields`.`contact_id` = `contacts`.`contact_id`
WHERE `custom_fields`.`value` = ?

在一个单独的表中存储可重复元素的方法是正确的。为什么它变得"极其困难……进行适当的搜索"?

加入父母id应该得到你想要的。也许您只是需要另一个列来排序,或者为详细表键出另一个列?

parent_id, data_desc, data' 123 ', ' mobile1"、"123.456.7890"

向联系人行添加新列从长远来看会给您带来更多的痛苦。

查看"Database Normalization",了解最适合您的表设计思想。