2013-05-06 104 views
1

在我的网站上,为我的服务成员提供了一个联系人数据库,他们可以存储他们所有的联系人。假设这个数据库更适合成员。当输入联系人时,它会询问所有标准问题,如名称和标题,然后将其存储在表contacts中。然后来到电话,地址,电子邮件和网站等附加字段。但联系人可以成倍增加,所以我希望我的成员能够无限制地进入。我通过为每个字段创建一个表,contacts_phone, contacts_address, contacts_email, contacts_website并且每行都有id,父级和数据。MySQL/PHP:数据库布局,排序和搜索

这让我非常难以获得正确的搜索。这些额外字段连接的唯一方式是通过parent,它保存它所连接的联系人的ID。 它也会导致一些其他的错误和错误,所以我决定废弃这个想法并认为它是一个失败。

现在我决定限制每个字段最多输入10个倍数。因此,在contacts表中,它现在有数百个列(phone_1_data,photo_2_data,phone_3_data等),只是看起来杂乱而错误。通过搜索,排序和交互会容易得多,但它看起来并不是最好的方式。

回答

1

对于任何自定义列,请添加一个简单的键值表,其中包含联系人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` = ? 
+0

我对MySQL没有很好的教育,我对这个答案有些困惑。无论如何,你可以展示一个例子吗? – 2013-05-06 20:48:35

+0

谢谢,我还是完全不明白'JOIN'。即使看到你的例子让我困惑,但我会花一些时间研究它,以便我可以学会正确使用它。 – 2013-05-06 21:00:11

1

您在正确的轨道上将可重复元素存储在单独的表格中。为什么它变得“非常困难......要进行适当的搜索”?

加入父母身份证应该让你知道自己失去了什么。也许你只需要另一列进行排序,或者键入详细表格?

PARENT_ID,data_desc,数据 '123', 'mobile1', '123.456.7890'

添加新列到接触的行会导致你从长远来看,更多的痛苦。查看“数据库标准化”,了解最适合您的表格设计思路。

+0

我最大的弱点是MySQL。我仍然不理解'JOIN'的概念或者我会如何使用它。你和艾德里安帮助我意识到我需要对此进行教育,因为它似乎是在这种情况下走的路。谢谢。 – 2013-05-06 20:59:24