0

我已经搜索了几个小时,但似乎仍然无法解决这个问题。我不明白我打算如何以标准化的方式填充这些内容。

问题 1-

+----+------+------------+-------------+----------+------+------------+--------------+-----------------+-----+-------+----------+-------------+--------+--------+------------+-----------------+---------------+---------+----------+----------+--------+----------+---------+--------+-------+------+--------+---------+
| id | year | wholesaler | design_line | style_no | size | size_range | retail_price | wholesale_price | hue | color | illusion | iridescence | fabric | length | silhouette | bodice_cut_outs | back_cut_outs | closing | neckline | shoulder | sleeve | feathers | sequins | stones | beads | lace | ruches | updated |

^礼服

我为其中许多列创建了单独的表。如,

+----+--------+
| id | type   |
+----+--------+
|  1 | no     |
|  2 | zipper |
|  3 | corset |
+----+--------+

^close_flag

我希望 gown.closing 唯一可能的选项是 closing_flag.type 的值。如果它只有两列,则使用单独的表进行规范化是否不合适?


问题 2- 我有其他列,例如色调,我希望能够为其填充多个值——对于具有多种色调的礼服,而不是针对具有多种色调的礼服款式。所以,我创建了

+----+---------+
| id | hue     |
+----+---------+
|  1 | yellow  |
|  2 | green   |
|  3 | blue    |
|  4 | violet  |
|  5 | fuschia |
|  6 | red     |
|  7 | orange  |
|  8 | brown   |
|  9 | black   |
| 10 | grey    |
| 11 | white   |
| 12 | print   |
+----+---------+

^hue_flag

但是,如何将 hue_flag 中的多个值插入到礼服中?


问题 3- 我在礼服中有多个列,它们应该具有相同的可能值。羽毛、亮片、宝石、珠子、蕾丝和褶边都是应包含描述其覆盖量的值的列。所以,我创建了

+----+---------+
| id | amount  |
+----+---------+
|  1 | no      |
|  2 | few     |
|  3 | some    |
|  4 | many    |
|  5 | totally |
+----+---------+

^coverage_flag

如何对另一个表中的多个列使用相同的值可能性?再说一次,有一个只有两列的表是不是很奇怪?我错过了标准化的重点吗?我试图尽可能地传统,但看起来我最终会以这种方式使用更多的空间,而不是简单地将值存储在两个表中,用户和礼服。

当然,我不指望有人能达到我提出的所有观点。我只想彻底解释我的问题。相信我还有其他的,但它们都属于这三种类型中的一种。我已经倾注了 [在此处输入链接描述][this] 和其他类似文章,但可以对如何实际应用这些概念做出正面或反面。

为便于阅读而编辑。

4

3 回答 3

1

问题 1:我会在你的礼服表中使用一个 closing_type_id 列。这样,您可以告诉数据库以确保没有关闭类型不存在的礼服,并且在重命名关闭类型时,您只需在一个地方进行更改。

我也不认为只有两列的表格有什么问题。

另外——关闭类型为 none 有意义吗?也许如果一件礼服没有closure_type,给它一个closure_type_id 0 会更有意义?

关于问题 2:您应该使用另一个表,也许是 gown_hues,具有列 gown_id 和 hue_id。然后,您可以在该表中为每件礼服的每种颜色设置一行。设置它,这样您就可以通过执行来检索与特定礼服相关的所有色调SELECT * FROM gown_hues WHERE gown_id = $gown_id。经验法则:几乎总有比尝试让单个字段包含多个值更好的方法。

问题3:这似乎是合理的。您的袍子表中的列是否包含字符串或coverage_flag 的id?我会选择后者(因为没有重复的信息)。然后在其他表中做同样的事情——任何其他可以被不同程度的东西覆盖的实体都可以包含你的coverage_flag表的外键。

于 2013-04-24T00:26:08.267 回答
0

按顺序回答您的问题:

1) 不,这不是问题。使 gown.closure 成为依赖于 closing.id 的外键

2)我有两种方法。您可以制作一个带有 Id 的色调表,以及一个链接 Gown Id 和 Hue Id 的 Gown_Hue 链接表。或者您可以将 GownId 添加到 Hue 表并确保它没有唯一约束。这样你就不会在 Gown 中插入多个值。如果我这样做,我会使用 Link 表的第一种方法。

3)本质上,这与问题二的答案相同。

以伪代码为例,您将有 3 个表

table Gown
{
   id UniqueIdentifier primary Key
}

table Hue
{
   id UnqiueIdentifier primary key
   hueDescription ntext
}

table Gown_Hue_Link 
{
   gownId UniqueIdentifier foreignKey => Gown.id
   hueId UniqueIdentifier foreignKey => Hue.id
}

所以要为你的礼服选择色调:

SELECT g.Id, h.hueDescription
FROM Gown g
 INNER JOIN Gown_Hue_Link ghl on ghl.gownId = g.id
 INNER JOIN Hue h on ghl.hueId = h.Id
WHERE G.id = <gown id>

我更喜欢上面的方法,因为这意味着你只需要一个可以与许多礼服相关联的色调,但你也可以用两个表来做到这一点:

table Gown
{
   id UniqueIdentifier primary Key
}

table Hue
{
   id UnqiueIdentifier primary key
   gownId UniqueIdentifier foreignKey => Gown.id
   hueDescription ntext
}

和:

SELECT g.Id, h.hueDescription
    FROM Gown g
     INNER JOIN Hue h on h.gownId = g.Id
    WHERE G.id = <gown id>
于 2013-04-24T00:25:24.577 回答
0

听起来你在正确的轨道上。

问题 1:不,使用只有两列的表没有任何问题。

问题 2:您需要一个中间表来将色调与礼服相关联。类似于gown_hues“gown_id”和“hue_id”列。

问题 3:是的,您可以使用同一个coverage表作为值来关联多个表中的“覆盖”。每个表都应包含与表coverage_id中的值相关的一个coverage

于 2013-04-24T00:25:49.573 回答