【问题标题】:How to store the data and improvise these tables?如何存储数据并即兴创作这些表格?
【发布时间】:2013-10-28 12:48:54
【问题描述】:

这些是我的表,第一个“壁纸”表将存储有关网站上所有壁纸的唯一详细信息,第二个是“壁纸类别”,如果它被归类为壁纸或只是一个拍摄的照片被标记为摄影,第三张将包括可用的尺寸。最后两个表将用于稍后对数据进行排序,就像我将对所有壁纸或所有被标记的壁纸进行排序一样作为摄影或所有桌面壁纸等,我的问题是,我不确定创建表格的可靠方法,因为第二个和第三个表格上有重复的数据,如果没有,那么如何即兴创作。最后一个请求是如何在 sql 数据库中实现这一点,比如我应该存储什么值来代替复选标记* ..我对此有点陌生,请帮忙。提前致谢!

【问题讨论】:

  • sql 数据库这个词比较模糊。 sql 代表各种数据库引擎使用的结构化查询语言。
  • 我建议更规范的设计。如果你不知道这意味着什么,我听说过这本书的好东西,数据库设计为凡人。

标签: php sql database normalization


【解决方案1】:

关于数据类型,这取决于数据库。有些提供 BIT 数据类型,而在另一些中您可能想要使用 CHAR(1) 或数字数据类型。考虑添加一个 CHECK 约束以将列限制为两个值并添加一个 NOT NULL 约束。

关于结构:如果您支持的集合类别和大小将来会发生变化,您可能希望将这些事实表示为关系:

create table wallpapers (
    wallpaper_id int, 
    wallpaper_name varchar, 
    ... , 
    primary key(wallpaper_id)
);

/* All categories your system handles */
create table categories (
    category_id int, 
    category_name varchar, 
    primary key(category_id)
);

/* Categories per wallpaper */
create table wallpaper_categories (
    wallpaper_id int, 
    category_id int, 
    primary key (wallpaper_id, category_id), 
    foreign key (wallpaper_id) references wallpapers (wallpaper_id),
    foreign key (category_id) references categories (categories_id)
); 

尺寸也是如此。

这样,您不必在每次有了新的类别或大小时都更改数据库设计。

【讨论】:

  • 由于存在重复的数据行,最后一个表 'wallpaper_categories' 的规范化程度会降低吗?
  • 不,那将是标准化设计。 “重复行”可能会产生误导。看看,例如,Database normalization。
  • am 如果我理解正确的话,我们最后一个表“wallpaper_categories”的想法是有两列,一列存储壁纸 ID,另一列存储类别 ID..例如将是第 1 行:1 (wallpaper_id) 2(category_id) 并且由于壁纸可以有另一个类别,第 2 行将是:1(wallpaper_id) 3(category_id)..这是这个表的样子吗?
  • @Vep 是的,wallpaper_categories 表将为墙纸和类别组合的每一对 id 包含一个条目,这些 id 在您的原始设计中具有复选标记。例如,如果没有壁纸在任何类别中具有复选标记,则 wallpaper_categories 将为空。例如,如果每个壁纸都有所有类别,则 wallpaper_categories 表将包含两个表的 id 的所有可能组合(即叉积)。表上的主键确保组合不能存储“双”。
  • @Vep 第二个问题:是的,这是在关系数据模型中建模一对多关系的常见模式。最简单的情况是 CREATE TABLE cmets(wallpaper_id INT, comment VARCHAR, FOREIGN KEY(wallpaper_id) REFERENCES wallpapers(wallpaper_id));请注意,到目前为止,评论没有密钥。如果需要,您可以添加一个,但这不是绝对必要的。这取决于您的需求。例如,您可以添加单个列 id(例如,comment_id),或者可以添加本地子键,例如,comment_no,这样您就有 PRIMARY KEY(wallpaper_id, comment_no)。
猜你喜欢
  • 2011-12-13
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多