SQL - 属性结构

时间:2011-10-13 19:03:32

标签: sql

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

我有3个表,一个表我们称之为水果,另外两个表是该水果的属性,所以fruit_detailed和fruit_basic。

水果

id | isDetailed

fruit_detailed

id |价格|颜色|来源|重量| fruitid?

fruit_basic

id |价值| fruitid?

所以我想做的是在水果中有一个名为isDetailed的属性,如果为true,请在fruit_detailed表中填充颜色,重量,来源等属性(多列)。如果为false则存储在fruit_basic表中,其中属性写在一行中。

存储听起来非常基本但如果我想选择水果并获取其属性,我该如何确定要加入哪个表?我可以在isDetailed属性上使用和IF语句然后像这样连接但是你有两种不同类型的属性回来

您将如何创建表格或进行连接以获取属性?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

假设fruit_basic的值与fruit_detailed的价格相同,那么你就会有类似的东西。

<强>水果

id | detail_id(fk到fruit_detailed表)

<强> fruit_details

detail_id |价格|颜色|来源|重量

答案 2 :(得分:0)

我可能会这样建模:

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_Basic表格中的“值”列是什么,所以我暂时将其删除了。

不要为了在每张桌子上都有一个ID列而把一堆ID放在那里。 Fruits-&gt; Fruit_Details关系是一对一或零关系。换句话说,每个Fruits行最多只能有一个Fruit_Details行。在某些情况下,Fruit_Details中可能没有Fruit中特定行的行。

当您查询时,您只需OUTER JOINFruits表到Fruit_Details表即可NULL。如果您为Fruit_Details.fruit_id取回Fruit_Details值,则表示该水果没有任何详细信息。您始终可以包含NULL列,如果该行不存在,它们将只是CASE WHEN Fruit_Details.fruit_id IS NULL THEN 0 ELSE 1 END AS isDetailed 。这样你就可以拥有同质的结果集。正如您所发现的那样,否则您最终不得不担心不同的列列表会根据所讨论的行而返回,这会导致大量的麻烦。

如果您想要包含“isDetailed”列,那么您可以使用它:

NULL

这种方法比将所有列放在一个表中更有优势,因为它可以降低数据库中{{1}}列的数量,并且根据您的数据可以显着降低存储要求并提高性能。