如何建立数据库表、数据库设计
Posted
技术标签:
【中文标题】如何建立数据库表、数据库设计【英文标题】:How to set up database tables, database design 【发布时间】:2016-01-23 12:44:05 【问题描述】:我正在尝试为市场网站设置数据库表,但在设置表时遇到了一些困难。
我有大约 18 个类别,每个类别都有很多子类别。所以我做了一个表category
,列出了18个类别和以下列:id
、category_name
、position
、visible
。
我为每个类别做了一个表格,因为每个类别都有不同的属性。例如,real estate
与 automobiles
具有不同的属性。所以我最终得到了 18 个表:每个类别一个表。
-
第一个问题:为每个类别创建表格是否正确?
第二个问题:每个类别表中的每一行都代表一个项目的广告。我对如何为图像设置表格感到困惑。每个广告都有一组图片。
所以问题是:我应该为每个父类别创建一个images
表,还是可以为所有类别创建一个images
表?
【问题讨论】:
正确编辑以便我们理解 @PathikVejani on ***,每个人都可以编辑问题以添加更多空白... 对不起,我是 *** 的新手,会尝试编辑它! 【参考方案1】:我感觉您需要阅读有关如何在表之间创建关系,尤其是外键的概念。
这是我对您描述的架构的再现:
# Our main table
CREATE TABLE `categories` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
# Regular foreign key
`image_id` int(11) unsigned NOT NULL,
# Polymorphic foregin key
`category_table` enum('automobiles','real_estate') NOT NULL,
`category_id` int(11) unsigned NOT NULL,
# Common category data
`name` text NOT NULL,
`position` smallint(5) NOT NULL,
`visible` enum('yes','no') NOT NULL,
PRIMARY KEY (`id`),
# Foreign key constraints
UNIQUE KEY `category_table` (`category_table`,`category_id`),
KEY `image_id` (`image_id`)
);
# A child table that stores automobile specific data
# - `categories` table refers to its records via `category_id` part of the foreign key, when `category_table` equals 'automobiles'
CREATE TABLE `categories_automobiles` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`make` varchar(255) NOT NULL,
`model` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
# A child table that store automobile specific data
# - `categories` table refers to its records via `category_id` part of the foreign key, when `category_table` equals 'real_estate'
CREATE TABLE `categories_real_estate` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`squarespace` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`)
);
# A table that stores images
# - `categories` table refers to its records via `image_id` foreign key
# - other tables may refer to its record as well
CREATE TABLE `images` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
# Either store image data itself in this table
`image_data` blob NOT NULL,
# or store file path to the image
`image_path` text NOT NULL,
PRIMARY KEY (`id`)
);
我希望这会有所帮助。
【讨论】:
非常感谢@chromice!我只是不明白你为什么把外键放在父表中,我认为父表主键必须是子表中的外键,我还以为我们总是必须在子表中设置约束。 您可以将category_id
放入images
表中,但是您将无法让“标签”表使用images
表,因为images
中的每条记录表将指向categories
表中的一个且唯一的记录;并且您将无法让多个 category
记录指向 images
表中的同一记录。至于多态关系,没有其他方法可以定义一对一的关系。如果子表有 category_id
指向主表,您可以创建添加唯一约束,即 categories
中的每条记录在 any 子表中只有一条记录。以上是关于如何建立数据库表、数据库设计的主要内容,如果未能解决你的问题,请参考以下文章
navicat如何添加索引?如何使用Navicat为数据库表建立索引?