我正在製作當地的網吧列表網站,我想獲得一些關於我的數據庫結構的反饋。存儲無EAV的屬性/選項數據
這些咖啡館有一堆屬性,他們可以在任何選項上選擇一個或多個屬性。這是我如何計劃存儲他們的數據。
表: '網吧'
CREATE TABLE `cafes` (
`cafe_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`cafe_types` text NOT NULL,
`location_types` text NOT NULL,
`amenities` varchar(255) NOT NULL,
`parking` varchar(255) NOT NULL,
PRIMARY KEY (`cafe_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
表: 'cafes_option_map'
CREATE TABLE `cafes_option_map` (
`map_id` int(11) NOT NULL AUTO_INCREMENT,
`column_name` varchar(30) NOT NULL,
`cafe_id` int(11) NOT NULL,
`name_id` int(11) NOT NULL,
PRIMARY KEY (`map_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
表: 'cafes_option_name'
CREATE TABLE `cafes_option_name` (
`name_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`name_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
列cafe_types,location_types,設施和停車場多種選擇與許多「選項」。這些選項需要進行排序和過濾。
我的問題是:
- 是一個很好的,爲什麼存儲數據的?
- 會有更好的方法來做到這一點。
我的想法是,'咖啡館'表將包含逗號分隔的屬性名稱列表(如人類易讀),以最少的數據庫調用輕鬆顯示,然後還有用於篩選和排序查詢的選項表。
我可以爲表格創建一些示例數據,如果這樣更容易理解。
你會建議你如何存儲這些數據?我不想要一個EAV結構。
''咖啡館'表將包含逗號分隔的屬性名稱列表'違反第一範式,因此是不好的設計。你希望你的屬性是動態的......不要這樣做。爲什麼不是EAV btw? –
只是比EAV更糟的是CSV,不要這樣做,它會一次又一次地咬你。相信我在DB中的CSV是一場噩夢。 – Johan