Sql ER/关系表到数据库

Sql ER/关系表到数据库,sql,database,foreign-keys,relational-database,entity-relationship,Sql,Database,Foreign Keys,Relational Database,Entity Relationship,因此,我有以下SQL命令用于下面的描述。我不确定我是否有正确的约束,特别是对于外键,以及何时使用NOTNULL和何时不太使用NOTNULL。有人能根据数据库描述验证命令是否正确吗 汽车经销商有唯一的企业id号、经销商名称、城市、州和唯一的 网站网址。业务id是一个介于1000-9999之间的数字。 销售人员有名字、姓氏、年龄、性别和唯一的员工id号。员工编号在100-999之间。 客户有名字、姓氏、城市、州、性别、年龄和唯一的纳税人id号。纳税人身份证号码为9位数字。 汽车有品牌、型号、年份、建

因此,我有以下SQL命令用于下面的描述。我不确定我是否有正确的约束,特别是对于外键,以及何时使用NOTNULL和何时不太使用NOTNULL。有人能根据数据库描述验证命令是否正确吗

汽车经销商有唯一的企业id号、经销商名称、城市、州和唯一的 网站网址。业务id是一个介于1000-9999之间的数字。 销售人员有名字、姓氏、年龄、性别和唯一的员工id号。员工编号在100-999之间。 客户有名字、姓氏、城市、州、性别、年龄和唯一的纳税人id号。纳税人身份证号码为9位数字。 汽车有品牌、型号、年份、建议价格和唯一的车辆id号。一辆汽车可能有多种颜色,这些颜色应该作为属性建模。注:汽车品牌为制造商,如福特、本田、宝马,车型为车型名称,如思域、雅阁、CRX。 销售人员为经销商工作。为了进入数据库,销售人员必须为经销商工作。但是,数据库中可能存在没有任何销售人员的经销商。经销商有许多为他们工作的销售人员,一个销售人员可能为许多不同的经销商工作。数据库应记录销售人员开始为经销商工作的开始日期。 经销商拥有自己的汽车。经销商可能拥有许多汽车,或者他们可能完全没有库存,并且没有汽车。一辆车只能由一个经销商拥有,并且必须由经销商拥有才能进入数据库。数据库应记录经销商购买汽车的日期以及经销商为汽车支付的价格。 销售人员向顾客出售汽车。即使销售人员没有向客户出售任何汽车,也应将其存储在数据库中。但是,数据库应该只存储从销售人员那里购买汽车的客户的信息。关于经销商拥有的汽车的信息应存储在数据库中,无论它们是否已售出。销售人员可能只向一位客户销售一辆特定的汽车。同样,客户也可以 仅从一名销售人员处购买特定的汽车。但是,客户可以从同一销售人员处购买多辆车。当销售人员向客户销售汽车时,销售价格和日期应记录在数据库中。 问题•教育 回答你的问题相当容易。我拿了你的课文,很快就完成了。我们在现实世界中已经拥有了50年的技术和方法:

学说 关系模型 35年来:

关系数据建模 ,关系数据建模的标准, 请注意,它是图形化的,而不是文本化的

SQL平台 一个真实的平台,用于关系模型的数据子语言。 注意,有许多假装sql提供者不是sql,因为它们不符合sql标准;无酸性交易;等 提供套件而不是平台,因为它们没有服务器架构;没有像样的一致性;等等

模型,而不是文本 见上文[2]

请注意,文字和单字符符号占用左半球4-6%的脑力,图表占用右半球94-96%的脑力。 当然,在构建一个完整的应用程序时,需要使用更多的标准,必须提及这些标准,但这些标准与您的问题无关,因此这里没有列举

所以在现实世界中,至少在高端市场,这是我的领域,生活是轻松的;直截了当地说,我们可以正确快速地建模和构建数据库和应用程序,并且可以根据扩展请求轻松地更改它们

但这并不是大学在高等教育中所教授的。正如你的问题和StackOverflow上成千上万的类似问题所证明的那样,所教授的内容是无效的、反关系的、大量推广的,例如你的教科书和所有使用它们的教授,被错误地贴上了关系的标签。本质上是预关系技术,使用预关系方法

理论 20世纪60年代的记录归档系统,取代了关系模型,但标记为关系。或者更糟糕的是,实际的关系代数,然后要求您从中计算出查询,而不是从数据模型。极端原始

非关系数据建模 ERD在1984年之前是伟大的,但自从使用IDEF1X的关系建模及其几十种变体出现以来就不复存在了

除了ERD不能、也没有处理关系模型的中心需求(例如关系键,这是复合自然键)这一事实,以及它没有准备模型进行规范化这一事实之外,它在细节上严重不足;在规格上

因此它不是r 很容易从ERD跳到SQLDDL,甚至提出改进的ERD

鉴于,IDEF1X标准是在RM之后开发和完善的,专门针对RM,它允许模型定义关系组件,如关系键,并允许模型从建模简单元素发展到复杂和完全详细的规范

事实上,大多数关系建模工具只需单击一个按钮即可将SQL注入服务器,数据库就可以进行DML编码

文本,而不是模型 无论是在理论层面,还是在建模层面,都在摆弄文本,这在我们没有绘图工具或建模工具的时候是非常棒的,但从那以后就不再存在了。这包括在SQL代码级别工作以暴露问题并处理问题,而不是在数据模型中或从数据模型中进行处理

致命的障碍 因此,处理给定的信息并创建所需的结果是非常直接的。使用1984年以来我们拥有的工具。但是,如果不是不可能的话,使用自1984年以来就已经失效、过时的古老方法和原始工具来实现这一目标是非常困难的。同时仍然保持教学问答的上下文

如果你让我把你从洛杉矶运到旧金山,我可以在8小时内完成它,我已经做过几次了。但是,如果你让我按照你教授的方法,使用马和车,每次马累了或车需要修理时就停下来,那就需要更长的时间。 因此,正如你的问题和成千上万的其他问题所证明的那样,你没有接受必要的科学教育,你正在被灌输错误的科学。请随意打印这一页,交给你的教授

这个问题,这个练习,实际上是一个经过深思熟虑的好问题。但同样,如果不使用关系建模方法,就不可能得出满足所有详细需求的正确答案。如果使用无腿ERD作为建模方法,就不可能得出正确答案,这正是您被教导使用的方法。这个练习是一个建模练习,绝对不是ERD到SQL的转换

我的范围 因此,使用我们自1984年以来使用的常规工具来回答这个问题是很容易的,但是从没有必要细节的ERD来回答这个问题是不可能的。就像从洛杉矶的马车跳到刚刚到达旧金山的火车座位上。 关系数据模型 我将给出结果,一个满足需求的数据模型。标准的强大之处之一是它定义了所需的所有细节,即所有规则和约束,不仅是建模者理解的细节,而且可以在表格所需的任何级别上呈现;表键;表键属性。。。数据类型;等等,我给你一个表属性级别,你可以计算出所需的SQLDDL

是的,我看了ERD,我想你得到了,这显然是不够的,不可能对所需的细节进行建模。即使建模练习是你应该解决问题的地方

是的,我看了你的记录图,这是一个很好的努力,可以精确地克服我所描述的问题。你的逻辑能力和直觉能力需要得到认可

注•符号 我所有的数据模型都在中呈现,这是自1993年以来关系数据库建模的标准

我的书是初学者的必备读物

注•内容 钥匙 你的教授已经给了每个等级的钥匙,作为一个明确的东西,这是独一无二的。这比20世纪60年代的记录归档系统要先进得多,后者的特点是记录ID字段。在上帝的恩典下,你没有被教导那些原始的东西

但是这些钥匙的名字不是很好。所以我保留了它们包含的内容,不是一个id,它有RFS的含义和限制,而是一个数字,带有范围定义,并给它们更好、更有意义的名称。 丢失的钥匙 不知道你是否需要识别缺失的元素通常你是。这些是为了防止重复行,或确保正常。我已在经销商处提供备用钥匙;人还有顾客

经销商卡

一辆车只能由一个经销商拥有,并且必须由经销商拥有才能进入数据库

因此,即使有这样的描述,汽车也不是独立的,并且给出了唯一的钥匙。请参阅下面的失败模型以进行比较。 因此,汽车是独立的,它只存在于经销商拥有的环境中:经销商汽车。这意味着与销售人员一样,汽车PK是经销商PK加上一个差异化因素。 这个区别当然是给定的车钥匙VehicleNo,主键是BusinessNo,VehicleNo。这一点很重要 我等会儿再去。 另外,为了保持汽车作为一个独特的实体,汽车钥匙VehicleNo是DealerCar中的备用钥匙。 将车钥匙作为AK保存到CustomerCar可确保该车保持独特性:它只能出售给一位客户;它只能由一名销售人员销售 售货员 因为一个人可以被不止一个经销商雇用,所以销售人员的事实,因此关键,不是给定的EmployeeNo,而是BusinessNo,EmployeeNo。模仿

顾客卡

客户可能只从一名销售人员处购买特定的汽车

更确切地说,一辆DealerCar只能由一名销售人员销售 一辆DealerCar只能卖给一个客户 由于VehicleNo在CustomerCar中的独特性而得以实施

但还有更多。更准确地说,只有一家经销商拥有的经销商卡只能由该经销商雇佣的销售人员销售。否则,销售人员可以出售属于他不为之工作的经销商的DealerCar。因此,由于复合关系键的实现:

在CustomerCar中,DealerCar PK为1::1 CustomerCar中销售人员PK为1::n,其中BusinessNo必须与DealerCar相同。下面是更多。 虽然一个顾客从一个销售员那里买了一辆车,但他实际上是从一个经销商那里买了一辆经销商车。 汽车颜色

一辆汽车可能有多种颜色,这些颜色应该作为属性建模

这打破了1NF: . 每个属性在平台上都必须是原子的 . 抱歉,不行,Jose,我不会建模错误。颜色是一个重复列,它属于从属表。模仿

年龄 存储改变相对值的值是一件非常愚蠢的事情:每年或每个季度,表都必须更新以反映不断变化的年龄。相对值不是事实,因此不应存储。不变的事实是,这个人的出生日期。从中可以很容易地得出年龄的价值

空的 很好的关注。由于数据模型是完全标准化的,因此不存在空值,所有列都不是空值。可为空的列是正常化不完整的明确指示器

业务规则/约束 数据库是一个自包含和自定义的恢复单元。因此,将所有业务规则和约束以及所有事务放在数据库容器中是正确的。但当然,规则有不同的类型,它们将以不同的方式部署:规则;检查和其他约束条件;索引主键;唯一的事务创建过程;等等

因此,必须精确地读取数据模型,并将每个项转换为适当的DDL命令

此外,除非扩展,否则无法在数据模型中显示所有约束(如事务)。它们必须记录在流程模型或对象中。事务是数据库API,在OO术语中,它们是方法

在任何情况下,需求中未明确解释的其余规则都是次要的,很容易从数据模型中读取。如果我把它们放在这里,这已经很长了,那就是TLDR了!。因此,我已经给出了这个细节;如何落实;;等等,在一个。享受

sqlddl 你的任务是选择任务。您已经为所需的SQL DDL提供了第一个剪切。很棒的作品,跨越了建模的鸿沟。希望您可以读取数据模型(其中包含更多详细信息read my),并将SQL DDL升级到数据模型中定义的状态

通过关系键实现关系完整性 这个练习揭示了一件非常重要的事情,也因此教会了我们这一点。请注意,您的教授可能知道也可能不知道或不理解这种关系概念:

如果他真的知道这一点,那就太好了,他选择了一个有意识地教授它的练习

但他没有给你完成练习所需的工具或教育。 如果他不知道这一点,那么无论数据模型类型是什么&他认为是正确和完美的SQL,答案都是关系解决方案的彻底失败

我上面给出的关系数据模型当然是正确和完整的。这正是因为它使用了关系键(这是一种自然键)和b组合键。当这些主键作为外键迁移到从属表中时,关系完整性(逻辑完整性与引用完整性(物理完整性)不同,只是SQL的一个特性)在从属表中实现

销售人员只能销售其雇佣的经销商拥有的经销商卡

同样地,客户只能从销售人员处购买经销商卡,这些经销商卡由雇佣该销售人员的经销商所有

数据模型 这里是一个数据模型,由一个不了解关系键或关系完整性的人建立,他只实现给定的键。 我将包括其他错误,以便与正确的模型进行比较

关系键

至少你的教授在数据中给出了唯一的键,这对层次结构有好处。 在通常的灌输中,1960年代的RFS被教导为关系型,键是物理记录ID。 关键是,

所有RFS解决方案均无任何相关功能, 以及任何半生不熟的关系解决方案,即理解和尝试的关系概念,但不理解它们提供的关系键和关系完整性, 有这个严重的错误

在这里,我使用了给定的键,但没有将它们建模为关系键,关系完整性丢失了是的,是的,我们仍然具有引用完整性,达到建模的级别。这些键被视为给定的,仅在逻辑上作为单列单元,这意味着实际逻辑键的片段是实现该目的(事实)所必需的

该模型对于RFS是正确的,并且仅限于该原始级别,但作为关系数据模型,它是一个失败

销售人员可以销售属于任何经销商的DealerCar,即不受其受雇为销售人员的经销商限制的汽车。哎呀

同样,客户可以从一个经销商和销售人员处购买一辆车,而经销商和销售人员不属于该经销商;销售员糟糕的末日

汽车 我将汽车建模为独立的,这是对所述汽车需求的盲目建模。但它未能模拟这一要求:

一辆车只能由一个经销商拥有,并且必须由经销商拥有才能进入数据库。 正确建模后,汽车是经销商所有的东西,所有的汽车属性(汽车PK VehicleNo为1::1)都会进入DealerCar

颜色 我已经按照要求显示了颜色,CSV列表,这是不正确的

享受


你的教科书会告诉你怎么做&这是一个常见问题。请参见文本上方的投票箭头(&S)。在卡住的地方问一个具体的问题。但是给出你正在使用的参考,有很多方法。请从其他文本中转述或引用。给出你所需要的&把它和你的问题联系起来。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。在图片中添加图例/图例和说明。后期编辑请在发布前查看您的帖子的格式化版本。请阅读方块码格式。另外,剩下的链接图不是标准符号,请给出图例,除非可以在文本中清楚地给出。当你拿到它的时候,有人告诉你如何阅读它。如果你不知道如何阅读其中的一部分,请说出哪些部分以及原因。我只是重复我上次的评论。关于你被困在什么地方,你的一个具体问题是什么?给出必要的信息。请不要放弃你的全部任务。PS你仍然没有说你认为你应该做什么。一个FK说一个子程序必须作为一个唯一的代码出现在其他地方。如果是这样&不是其他声明的结果,那么就声明它。你被要求做什么,你有什么问题?

create table Car_dealership(
Business_id int check ( 1000 >= business_id <= 9999),
b_name varchar(30) not null,
b_city varchar(20) not null,
b_state char(2) not null,
web_url varchar(100) not null,
primary key (Business_id)
);

create table salesperson (
employee_id int check ( 100 >= employee_id <= 999),
first_name varchar (30) not null,
last_name varchar (30),
age int check (0 < age < 130) , 
gender char(1),
/* assumed gender is either Male (M) or Female (F) */
primary key (employee_id)
);

create table customers (
taxpayer_id decimal(9,0),
first_name varchar (30) not null,
last_name varchar (30),
age int check (0 < age < 130), 
gender char(1),
/* assumed gender is either Male (M) or Female (F) */
city varchar (20),
state char(2),
primary key (taypayer_id),
);

create table cars (
vehicle_id int,
make varchar(30),
model varchar(30),
make_year year,
suggested_price int, 
business_id int, 
date_acquired date,
price_paid int,
primary key (vehicle_id),
foreign key(business_id) references Car_Dealerships (business_id)
);

create table car_colors (
vehicle_id int,
colors varchar (30),
primary key (vehicle_id),
foreign key(vehicle_id) references cars (vehicle_id)
);

create table works_for (
business_id int,
employee_id int,
start_date date not null,
primary key (business_id, employee_id),
foreign key(business_id) references Car_Dealerships (business_id),
foreign key(employee_id) references salesperson (employee_id) 
);

create table sells (
vehicle_id int,
taxpayer_id int,
employee_id int,  
sale_price int, 
date_sold date,
primary key (vehicle_id) ,
foreign key(vehicle_id) references cars (vehicle_id),
foreign key(taxpayer_id) references customers (taxpayer_id),
foreign key(employee_id) references salesperson (employee_id)
);