如何建立数据库表、数据库设计

Posted

技术标签:

【中文标题】如何建立数据库表、数据库设计【英文标题】:How to set up database tables, database design 【发布时间】:2016-01-23 12:44:05 【问题描述】:

我正在尝试为市场网站设置数据库表,但在设置表时遇到了一些困难。

我有大约 18 个类别,每个类别都有很多子类别。所以我做了一个表category,列出了18个类别和以下列:idcategory_namepositionvisible

我为每个类别做了一个表格,因为每个类别都有不同的属性。例如,real estateautomobiles 具有不同的属性。所以我最终得到了 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为数据库表建立索引?

数据立方建立-如何实现一对多,多对多

navicat怎么建立模型?如何使用Navicat创建数据模型?

如何用JPA建立这样的数据库表结构

access建立查询时,啥情况下两表之间要建立关系

navicat触发器怎么设置?如何使用Navicat为数据库表建立触发器啊?