在我的网站上,我为我服务的成员提供了一个联系人数据库,他们可以在其中存储他们所有的联系人。这个数据库应该更适合成员。在输入联系人时,它询问所有标准问题,如姓名和头衔,然后将它们存储在表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"
向联系人行添加新列从长远来看会给您带来更多的痛苦。