在数据库表中存储多个ID的理想解决方案是什么?

时间:2011-02-03 05:55:25

标签: mysql database database-design

我的房地产应用程序有一个数据库表,用于保存用户的查询(查询)。此表包含有关特定房地产查询的所有信息。

数据库表看起来像这样:

CREATE TABLE IF NOT EXISTS `queries` (
  `id` bigint(20) NOT NULL auto_increment,
  `category_id` int(10) NOT NULL,
  `serial` varchar(30) NOT NULL,
  `minBudget` int(11) NOT NULL,
  `maxBudget` int(11) NOT NULL,
  `city_id` int(10) NOT NULL,
  `area_id` int(10) NOT NULL,
  `locality` varchar(100) NOT NULL,
  `status` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

city_idarea_id中,我可能会想要存储多个 ID;例如,10,12,20,50等。

我应该如何将其存储在数据库中?

我应该使用varchar数据类型并将其保存为定义了分隔符的字符串,然后获取数组中的值吗?

2 个答案:

答案 0 :(得分:4)

你可以这样做,但它并不是首选的解决方案。这是数据库规范化的经典权衡。

“更正确”的方法是使用表格“城市”和“区域”,并将表格“queries_cities”和“queries_areas”与多对多关联起来。

否则 - 如果城市或地区ID发生变化会怎样?您可以编写一个脚本来手动更新所有查询记录,而不是在一个地方更改单个记录。

答案 1 :(得分:1)

如果这些是另一个表的ID,请不要使用varchar。使用多对多表将它们映射在一起。

CREATE TABLE IF NOT EXIST `query_cities` (
 `id` bigint(20) NOT NULL auto_increment,
 `query_id` bigint(20),
 `city_id` bigint(20)
)

CREATE TABLE IF NOT EXIST `query_areas` (
 `id` bigint(20) NOT NULL auto_increment,
 `area_id` bigint(20)
)

这比将东西填充到varchar要清晰得多 - 例如,它允许你说:

SELECT c.city_name, c.state, c.whatever FROM queries q 
JOIN cities c ON (q.city_id = c.id) WHERE q.id = ?

编辑:嗯,我很蹩脚,并没有包含外键,但是你明白了。