设置这个表结构的最佳方法是什么
我有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_Details
表OUTER JOIN
。如果你得到Fruit_Details.fruit_id
的NULL
值,那么你就知道这个水果没有任何细节。您总是可以包含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 |价格|颜色|来源|重量