SQL-Properties结构

SQL-Properties结构,sql,Sql,设置此表结构的最佳方法是什么 我有三张桌子,一张桌子我们称之为水果,另外两张桌子是水果的属性,所以水果是详细的,水果是基本的 水果 id |已详细说明 水果 id |价格|颜色|来源|重量|水果id 基本水果 id |值|果id 所以我想做的是在水果中有一个名为isDetailed的属性,如果为true,则用颜色、重量、来源等属性(多列)填充水果详细表。如果为false,则将属性写入一行存储在FROUT_basic表中 存储听起来很基本,但如果我想选择一个水果并获取其属性,我如何确定要加入哪个表

设置此表结构的最佳方法是什么

我有三张桌子,一张桌子我们称之为水果,另外两张桌子是水果的属性,所以水果是详细的,水果是基本的

水果 id |已详细说明

水果 id |价格|颜色|来源|重量|水果id

基本水果 id |值|果id

所以我想做的是在水果中有一个名为isDetailed的属性,如果为true,则用颜色、重量、来源等属性(多列)填充水果详细表。如果为false,则将属性写入一行存储在FROUT_basic表中

存储听起来很基本,但如果我想选择一个水果并获取其属性,我如何确定要加入哪个表?我可以在isDetailed属性上使用and IF语句,然后像那样连接,但之后会返回两种不同类型的属性


如何创建表或进行连接以获取属性?我遗漏了什么吗?

我不知道你们为什么需要在不同的桌子上储存水果的基本或详细清单。您应该只有一个表,如果信息不存在,则将一些字段保留为空

假设fruit_basic的值与fruit_detailed的价格相同,您会得到类似的结果

水果

id |详细信息(fk至水果(详细信息表)

水果详细信息


详细信息| id |价格|颜色|来源|重量

我不确定您为什么需要在不同的表格中存储水果的基本或详细列表。您应该只有一个表,如果信息不存在,则将一些字段保留为空

假设fruit_basic的值与fruit_detailed的价格相同,您会得到类似的结果

水果

id |详细信息(fk至水果(详细信息表)

水果详细信息


detail|id | price | color | source | weight

就个人而言,我认为没有必要将基本属性和详细属性拆分为单独的表。我认为它们可以/应该都是主水果表的列。

我个人认为没有必要将基本属性和详细属性拆分为单独的表。我认为它们可以/应该都是主水果表的列。

我可能会这样建模:

CREATE TABLE Fruits (
    fruit_id    INT    NOT NULL,
    CONSTRAINT PK_Fruit PRIMARY KEY CLUSTERED (fruit_id)
)

CREATE TABLE Fruit_Details (
    fruit_id    INT               NOT NULL,
    price       MONEY             NOT NULL,
    color       VARCHAR(20)       NOT NULL,
    source      VARCHAR(20)       NOT NULL,
    weight      DECIMAL(10, 4)    NOT NULL,
    CONSTRAINT PK_Fruit_Detail PRIMARY KEY CLUSTERED (fruit_id),
    CONSTRAINT FK_Fruit_Detail_Fruit FOREIGN KEY (fruit_id) REFERENCES Fruit (fruit_id)
)
我不得不为一些列猜测合适的数据类型。我也不确定您的
Fruit\u Basic
表中的“value”列到底是什么,所以我暂时把它省略了

不要为了在每个表上都有一个ID列而在那里放一堆ID。水果->水果详情关系是一对零或一关系。换句话说,每个水果行最多只能有一个水果详细信息行。在某些情况下,您可能没有水果中某一行的详细信息

查询时,只需从
Fruits
表到
Fruits\u Details
表进行
OUTER连接即可。如果您为
Fruit\u Details.Fruit\u id
返回
NULL
值,则您知道该水果没有任何详细信息。您可以始终包含
Fruit\u Details
列,如果该行不存在,它们将仅为
NULL
。这样,您就可以始终拥有相同的结果集。正如您所发现的,否则您最终不得不担心根据所讨论的行返回不同的列列表,这将导致大量的麻烦

如果要包含“isDetailed”列,则可以使用以下命令:

CASE WHEN Fruit_Details.fruit_id IS NULL THEN 0 ELSE 1 END AS isDetailed

与将所有列放在一个表中相比,这种方法还有一个优势,因为它减少了数据库中
NULL
列的数量,并且根据您的数据可以大大减少存储需求并提高性能。

我可能会这样建模:

CREATE TABLE Fruits (
    fruit_id    INT    NOT NULL,
    CONSTRAINT PK_Fruit PRIMARY KEY CLUSTERED (fruit_id)
)

CREATE TABLE Fruit_Details (
    fruit_id    INT               NOT NULL,
    price       MONEY             NOT NULL,
    color       VARCHAR(20)       NOT NULL,
    source      VARCHAR(20)       NOT NULL,
    weight      DECIMAL(10, 4)    NOT NULL,
    CONSTRAINT PK_Fruit_Detail PRIMARY KEY CLUSTERED (fruit_id),
    CONSTRAINT FK_Fruit_Detail_Fruit FOREIGN KEY (fruit_id) REFERENCES Fruit (fruit_id)
)
我不得不为一些列猜测合适的数据类型。我也不确定您的
Fruit\u Basic
表中的“value”列到底是什么,所以我暂时把它省略了

不要为了在每个表上都有一个ID列而在那里放一堆ID。水果->水果详情关系是一对零或一关系。换句话说,每个水果行最多只能有一个水果详细信息行。在某些情况下,您可能没有水果中某一行的详细信息

查询时,只需从
Fruits
表到
Fruits\u Details
表进行
OUTER连接即可。如果您为
Fruit\u Details.Fruit\u id
返回
NULL
值,则您知道该水果没有任何详细信息。您可以始终包含
Fruit\u Details
列,如果该行不存在,它们将仅为
NULL
。这样,您就可以始终拥有相同的结果集。正如您所发现的,否则您最终不得不担心根据所讨论的行返回不同的列列表,这将导致大量的麻烦

如果要包含“isDetailed”列,则可以使用以下命令:

CASE WHEN Fruit_Details.fruit_id IS NULL THEN 0 ELSE 1 END AS isDetailed

与将所有列放在一个表中相比,这种方法还有一个优势,因为它减少了数据库中
NULL
列的数量,并且根据您的数据可以大大减少存储需求并提高性能。

首先,您需要在水果表中设置水果详细信息id字段。这应该是与其对应的详细条目的主键id。水果的细节可能根本就没有必要。如果不存在fruit.fruit\u detailed\u id,则该水果没有详细信息。如果我没有水果的详细信息,并且我想将其输入fruit\u basic,那么水果表如何知道fruit\u basic中有条目?因此,有关水果的信息可以输入详细信息,也可以输入基本信息,而不能同时输入水果_