设置此表结构的最佳方法是什么。
我有3个表,一个表我们称之为水果,另外两个表是该水果的属性,所以fruit_detailed和fruit_basic。
id | isDetailed
id |价格|颜色|来源|重量| fruitid?
id |价值| fruitid?
所以我想做的是在水果中有一个名为isDetailed的属性,如果为true,请在fruit_detailed表中填充颜色,重量,来源等属性(多列)。如果为false则存储在fruit_basic表中,其中属性写在一行中。
存储听起来非常基本但如果我想选择水果并获取其属性,我该如何确定要加入哪个表?我可以在isDetailed属性上使用和IF语句然后像这样连接但是你有两种不同类型的属性回来
您将如何创建表格或进行连接以获取属性?我错过了什么吗?
答案 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 JOIN
从Fruits
表到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}}列的数量,并且根据您的数据可以显着降低存储要求并提高性能。