1

在我的网站上,我为我的服务成员提供了一个联系人数据库,他们可以在其中存储所有联系人。该数据库应该更适合会员。输入联系人时,它会询问所有标准问题,例如姓名和头衔,然后将它们存储在 table 中contacts。然后是电话、地址、电子邮件和网站等附加字段。但是联系人可以是这些的倍数,所以我希望我的成员能够无限制地输入。我通过为每个字段制作一个表格来做到这一点,contacts_phone, contacts_address, contacts_email, contacts_website并且每一行都有 id、父级和数据。

这让我很难进行适当的搜索。连接这些额外字段的唯一方法是通过parent它保存它所连接的联系人的 ID。它还会导致其他一些错误和错误,所以我决定放弃这个想法并认为它是失败的。

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

4

2 回答 2

1

你在正确的轨道上将可重复的元素存储在一个单独的表中。为什么它变得“极其困难......进行适当的搜索”?

加入父母身份证应该会让你得到你想要的。也许您只是需要另一列进行排序,或者为详细表关闭?

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

从长远来看,向联系人行添加新列会给您带来更多痛苦。查找“数据库规范化”以获得最适合您的表格设计理念。

于 2013-05-06T20:55:53.120 回答
1

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

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` = ?
于 2013-05-06T20:44:26.590 回答