SQL -属性结构

  • 本文关键字:结构 属性 SQL sql
  • 更新时间 :
  • 英文 :


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

我有3个表格,其中一个表格我们称之为fruit,另外两个表格是水果的属性,即fruit_detailed和fruit_basic。

水果

id | isDetailed

fruit_detailed

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

fruit_basic

id | value | fruitid?

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

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

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

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

我可能会这样建模:

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->Fruit_Details关系是一对零或一的关系。换句话说,对于每个Fruits行,最多只能有一个Fruit_Details行。在某些情况下,水果中的某一行可能在Fruit_Details中没有行。

当你查询时,你可以简单地从Fruits表到Fruit_DetailsOUTER JOIN。如果你得到Fruit_Details.fruit_idNULL值,那么你就知道这个水果没有任何细节。您总是可以包含Fruit_Details列,如果行不存在,它们将只是NULL。这样就可以得到齐次的结果集。正如您所发现的,否则您最终不得不担心根据所讨论的行返回不同的列列表,这将导致大量的头痛。

如果你想包含一个"isDetailed"列,你可以这样写:

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

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

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

假设来自fruit_basic的value与来自fruit_detailed的price相同,您将得到如下内容:

id | detail_id (fk to fruit_detailed table)

fruit_details

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

最新更新