2011-02-03 7 views
1

私の不動産アプリケーションには、ユーザーが質問(お問い合わせ)を保持するデータベーステーブルがあります。この表には、特定の不動産クエリに関するすべての情報が含まれています。複数のIDをデータベーステーブルに格納する理想的なソリューションは何ですか?

データベーステーブルは次のようになります。

city_id
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; 

およびarea_idチャンスは私が複数のIDを保存したい状況があります。例えば、10,12,20,50などとすることができる。

これをdatabsaeにどのように保存する必要がありますか?

varcharデータ型を使用し、区切り文字が定義された文字列として保持する必要がありますか?次に、値を配列にフェッチしますか?

+0

「Mereal Mortalのためのデータベース設計」の本では、複数値フィールドと呼ばれています。あなたはそれらからテーブルを抽出することによってそれを排除する必要があります。もしあなたがそれを読んでいなければ、読んでみてください。 – zawhtut

答えて

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 = ? 

は編集:MEH、私はラメだと外部キーが含まれていませんでした、そこに、しかしあなたはポイントを得る。

+0

あなたとローガーに感謝します。私はこの方法を採用しています:)。 –

4

あなたはそうすることができますが、それは本当に好ましい解決策ではありません。これは、データベースの正規化における古典的なトレードオフです。

「より正確な」アプローチは、テーブル「都市」と「エリア」と、それらを関連付ける多対多のテーブル「queries_cities」と「queries_areas」を持つことです。

都市やエリアIDが変更された場合はどうなりますか? 1つのレコードを1か所で変更するのではなく、すべてのクエリレコードを手動で更新するためのスクリプトを作成する必要があります。

+0

私は同意し、あなたの提案に感謝します。私は確かにあなたが提案したことを続けています。 –

関連する問題