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

时间:2013-05-06 20:41:49

标签: php mysql

在我的网站上,对于我的服务成员,我提供了一个联系人数据库,他们可以存储所有联系人。假设该数据库更适合该成员。输入联系人时,它会询问所有标准问题,如姓名和职称,然后将其存储在表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等等),看起来很混乱。搜索,排序和交互将变得更加容易,但这似乎不是最佳方式。

2 个答案:

答案 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'

在联系人行中添加新列会让您在长期内感到更痛苦。查找“数据库规范化”,了解最适合您的表格设计思路。