在我的网站上,对于我的服务成员,我提供了一个联系人数据库,他们可以存储所有联系人。假设该数据库更适合该成员。输入联系人时,它会询问所有标准问题,如姓名和职称,然后将其存储在表contacts
中。然后是其他字段,如电话,地址,电子邮件和网站。但是联系人可以是那些的倍数,所以我希望我的成员能够无限制地进入。我通过为每个字段contacts_phone, contacts_address, contacts_email, contacts_website
创建一个表来完成此操作,每行都有id,parent和data。
这让我很难得到正确的搜索。这些额外字段连接的唯一方法是通过parent
保存与其连接的联系人的ID。
它还会导致其他一些错误和错误,所以我决定废弃这个想法并认为它失败了。
现在我决定限制成员每个字段最多输入10个倍数。因此,在表格contacts
中,它现在有数百列(phone_1_data,photo_2_data,phone_3_data等等),看起来很混乱。搜索,排序和交互将变得更加容易,但这似乎不是最佳方式。
答案 0 :(得分:1)
对于任何自定义列,添加一个简单的键值表,其中包含联系人ID,字符串键和字符串值。您可以使用此选项将任意数量的任意自定义字段与联系人进行匹配,并且可以使用JOIN
进行搜索。
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` = ?
答案 1 :(得分:1)
您在正确的轨道上将可重复的元素存储在一个单独的表中。为什么它变得“非常难......正确搜索”?
加入父ID应该让你得到了什么。也许你只需要另一列来排序或关闭详细信息表?
parent_id,data_desc,data '123', 'mobile1', '123.456.7890'
在联系人行中添加新列会让您在长期内感到更痛苦。查找“数据库规范化”,了解最适合您的表格设计思路。