【问题标题】:Is this database scheme sensible?这种数据库方案合理吗?
【发布时间】:2014-03-05 17:09:19
【问题描述】:

我需要一些帮助来为一个关于家具的 PHP 网站设计我的数据库。

我有很多主要类型,那就是应用领域。例如办公室、户外等。

我有皮革、布料等类别。

一个类别可以有多种类型。例如,布类物品可以在办公室和户外使用,例如,皮革不能在办公室使用。

每个类别都有一个名为“链接”的字段,用于存储要在 PHP 页面菜单中显示的图像。

一个页面也有一个语言字段来显示不同语言的描述。

每个类别里面都有很多产品。某些类别与内部的其他类别具有相同的产品。

例如,

  • 皮革可用于办公室制作皮椅。
  • 可以在办公室使用布制物品制作布艺沙发。
  • 但是皮革制品也可以在户外制作皮椅。

所以同一个产品可以分为两个类别。

一个产品有许多模型图像(后视图、前视图、红色、黑色等)。

有些产品有一种技术图表,而另一些产品有另一种技术图表。例如,对于布椅,我不想显示宽度,而对于皮椅,我想显示它是否易碎。技术图表也有不同的语言。

这是我的第一个大型数据库。

下面的方案可以吗?还是我有概念缺陷?

(我添加了管理员,因此可以添加或取消产品或类别。)

为了澄清,我或多或少有这个:

  • 类型:办公室、户外、汽车、航海、合同、休闲
  • 类别:皮革、仿皮、布、特卫强
  • 产品:椅子、沙发、雨伞、桌子、罩子……

每个产品都可以只属于一个类别,但可以用于不止一种类型。因此,例如,椅子可以仅由皮革制成,但可以用于多种类型。

当我在我的网站上选择一种类型时,我想显示该类型中的类别(类别可以在类型之间共享),然后我想选择该类别中的产品并查看可以使用哪种类型。

这是一个更新的数据库方案:

【问题讨论】:

  • 是页面还是产品需要不同语言的描述?
  • 技术图表需要用不同的语言完成。并且对于类别的简要描述必须用不同的语言和不同的类型来完成。 (例如,如果我在类型学办公室,我想写字,我的皮革耐墨水,而如果我在户外,我想写我的皮革耐紫外线。
  • IMO:类型学和类别之间的关系是隐含的,不像你描述的那样明确。您的产品表应该有一个类别和一个类型。类别和类型之间的关系基于两者兼有的产品。否则,根据您的设计,您可以拥有一个布艺沙发(即类别 = 布艺)。它隐含了办公室和户外的类型。
  • 但我无法将产品链接到通过 trought 类别的类型学?
  • @AgRizzo 对不起,我的错,你是对的,我受到网站设计的影响,因为每个类型都有不同的类别。我的意思是:如果我选择户外->我应该只看到属于户外的类别如果我选择办公室->我应该看到属于办公室的类别(其中一些可以是共享的)并且每个产品都可以用于更多不止一种类型

标签: mysql database database-design


【解决方案1】:

第一条规则,防止一个类别在数据库中被输入两次或多次。例如,输入可在室内和室外或两者兼用的皮革的照片和描述。假设您有一个“材料”表。无论您的家具材料是什么,我都会进行如下分类,例如:输入 {Enum('indoor', 'outdoor', 'in-outdoor')} 或数字格式,即 {'1','2',' 3'} 您可以在评论部分中添加注释,在表格内的数字代表什么。

然后从你的材料表中调用材料,而不是分别创建室内材料表和室外材料表。

【讨论】:

  • 我只有 1 个类型表,与类别 N:M 相关,所以我不重新输入它。问题是类型学是 7(如果我看图像会更清晰 xD)
  • 数字 7 代表什么?你的意思是表中有 7 个不同的变量?
  • 是的类型是7种不同的类型(产品的应用领域)
  • 我的意思是“办公室”和“户外”是一类。意思是,他们定义了它可以在哪里使用。无需放置一个名为“office”的变量和一个名为“outdoor”的变量。
  • 如果你告诉我你的变量是什么,也许会有所帮助。我认为您将需要两个以上的表,例如链接到“语言”表的“图像”表。
【解决方案2】:

这对于第一次尝试来说还不错。 (顺便说一句,我曾经在一家大型家具公司工作,所以这是一种罕见的情况,我实际上对我试图在 Stackoverflow 上回答的一个问题所指的真实数据有所了解!)

我看到的最大问题是类型学和类别之间的关系。通过类别将产品链接到类型学,这意味着在我看来是相同的类别,例如“皮革”需要多条记录,每种可能的类型都有一条记录。例如,如果您有皮革办公家具和皮革客厅家具,则必须创建两个皮革记录。

我认为从 Product 到 Category 有一个 FK 和从 Product 到 Typology 有一个单独的、不相关的 FK 会更有意义。我猜你不需要强制执行限制,比如说,办公家具不能是柳条的。您只是不会有任何此类产品记录。但是,如果您确实需要强制执行此操作,那么我会在数据库中添加另一个表,该表连接类别和类型,并且将对所有可能的组合进行编码。也就是说,可能有(办公室,皮革),(客厅,皮革),(办公室,织物),(户外,柳条)等的类别类型记录。然后在添加产品记录之前,您验证组合在应用程序代码或触发器中都是合法的。

我对通过 Chart_type 将技术图表链接到产品感到复杂。这张额外的桌子给你带来了什么?为什么不直接将它们链接到产品记录?我认为您只能拥有一种或其他图表类型,而不是两者兼而有之?但是创建中间表并不会阻止创建两个记录。我认为您需要代码(或触发器)来说明如果存在一个,则不允许创建另一个或发出警告。当您正在寻找一个时,只需在两个表上留下 join 并查看您找到的。如果您需要在创建技术规范记录之前指定给定产品所需的内容,则在 Product 中放置一个字段来说明哪个是必需的。如果直到您实际创建一个才确定需要哪个,那么记录的存在说明了哪个需要并且您不需要任何其他字段。

我不清楚 Category_type 的用途。假设您需要将类别链接到类型学,为什么不直接链接它们呢?为什么是中间的桌子?

顺便说一句,您的某些术语似乎很奇怪。这个术语是由客户规定的,还是您试图从另一种语言翻译?

因为“类别”似乎是指“材料”。为什么不用更具体、更清晰的“材料”来称呼它呢?

“模型”似乎是指“图像”或“图片”。为什么不这么称呼它? “型号”是“产品”的同义词。 (有些公司会用它们来表示不同的东西,通常模型是给定产品的子类型,反之亦然。)

“类型学”一词的意思是“分配类型的系统”,而不是类型。您可以将此表称为“类型”。我一般不喜欢称事物为“类型”,因为这非常模糊:当我们问什么“类型:一件家具是”时,我们是否希望有人回答“卧室”、“皮革”、“殖民地”、“顶部” quality”、“imported”或其他几十种可能的分类中的任何一种?我个人将这张表称为“setting”。

但如果您正在翻译,也许原始名称非常有意义,这是一个有争议的问题。

【讨论】:

  • 我明白了你把那两张桌子分开的意思。我把一张桌子放在中间,因为是 N:M 关系,所以我需要考虑一张中间桌子。 (类型与类别有关)因为在我的网站上选择类型时,我需要显示类型的所有类别。实际上,产品是独一无二的。我的意思是我不能有 2 个类别的 1 个产品。另外,Language可以这样放在表中吗?所以我有不同语言的同一项目的多个记录,每个人附近都有 EN、IT 或 FR。所以我可以随心所欲地提取。
  • 我看不出你在哪里有 M:M。也许我只是错过了它,或者也许你的基数在某个地方倒退了。
  • 我的意思是,由于一个产品可以有多个我们的领域,而一个使用领域可以有多个产品,这是一个N:M的关系。所以我需要通过一张桌子
  • 唯一的问题是要恢复哪个材料有一个应用领域我必须做 4 加入
  • 但是您的图表中没有 M:M。无论如何,在您的图表中,您显示了一个类别链接以增加类型学,但无法判断哪种类型学适用于给定产品。也就是说,如果您这么说,例如,您可以有皮革用于办公室和客厅,并且您说皮革沙发样式 XYZ 属于皮革类别,您怎么知道它是办公室还是客厅?这就是为什么我说你需要一个从产品到类别的链接以及一个从产品到类型学的链接。您不能通过类别链接。它不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多