当产品差异很大时,设计产品数据库模式的最佳方法是什么?
What is an optimal way to design a product database schema when products can vary greatly?
我正在尝试使用FileMaker 14设计产品数据库。我们的产品主要有:
适配器:HDMI 转 DisplayPort; USB转VGA; USB转以太网; SD/micro SD card/Compact 闪存阅读器等...
扩展坞:USB-C 至 DisplayPort/HDMI/USB-A 2.0/USB-A 3.0/USB-C 3.0/USB-C 2.0/AUX-in/AUX-out,等等...
USB集线器:2/4/6/8/10口USB集线器,可由总线或电源适配器供电,带或不带以太网等...
以后可能会推出其他类型的产品
我希望数据库能够输出规范 sheet,其中包括:
- 型号
- 产品名称
- 图像(打印一张,笔记本电脑或 tablet 显示多张)
- 上行接口(各种视频、数据、音频)
- 下游接口(各种视频、数据、音频)
- 电源(总线或电源适配器,不同类型的电源适配器)
- 维度
- 体重
- 操作环境
- 支持的操作系统
我已尽我所能将它们规范化,但我对 接口 的实现方式感到困惑。我认为我有的选项:
将它们合二为一table
ProductUpstreamInterfaces:
ProductID (primary foreign key)
USB-A2
USB-A3
USB-B
USB-C2
USB-C3
Thunderbolt1
Thunderbolt2
Thunderbolt3
AUX-in
AUX-out
HDMI
.
.
.
和
ProductDownstreamInterfaces:
ProductID (primary foreign key)
USB-A2
USB-A3
USB-B
USB-C2
USB-C3
Thunderbolt1
Thunderbolt2
Thunderbolt3
AUX-in
AUX-out
HDMI
.
.
.
其中每个字段的值都是数量。
拆散他们
ProductInterfaces:
ProductID (primary foreign key)
InterfaceID (foreign key)
Quantity
Direction_1Up2Down (1 for up; 2 for down)
和
Interfaces:
InterfaceID (primary key)
Interface (eg. HDMI/DisplayPort/USB-C2/USB-C3/AUX-in/AUX-out, etc...)
选项1看起来真的很乱。
选项 2 似乎更好,但我不确定我是否会 运行 遇到任何问题......这两个哪个更好?有更好的方法吗?
除了极少数例外,只要您有许多 Y(接口)与一个 X(产品)相关,就应该将它们放在单独的 table 中。当join本身有属性时(比如你例子中的Quantity),也不会有例外。
OTOH,我不明白你为什么需要第三个 table ("Interfaces")。除了显示的字段外,它还有其他字段吗?如果没有,自定义值列表应该就足够了。
警告
请确保您没有想太多。有时,接口列表只是字段中的文本。这完全取决于您的解决方案打算实现的目标。连接 table 支持的多对多关系在您需要跟踪哪些接口在哪些产品中使用时很有用,能够快速 create/modify 产品的接口,也许生成一些统计数据(例如“80% 的类别 X 中的产品具有界面 Y”)等。否则,这只是浪费资源。
我正在尝试使用FileMaker 14设计产品数据库。我们的产品主要有:
适配器:HDMI 转 DisplayPort; USB转VGA; USB转以太网; SD/micro SD card/Compact 闪存阅读器等...
扩展坞:USB-C 至 DisplayPort/HDMI/USB-A 2.0/USB-A 3.0/USB-C 3.0/USB-C 2.0/AUX-in/AUX-out,等等...
USB集线器:2/4/6/8/10口USB集线器,可由总线或电源适配器供电,带或不带以太网等...
以后可能会推出其他类型的产品
我希望数据库能够输出规范 sheet,其中包括:
- 型号
- 产品名称
- 图像(打印一张,笔记本电脑或 tablet 显示多张)
- 上行接口(各种视频、数据、音频)
- 下游接口(各种视频、数据、音频)
- 电源(总线或电源适配器,不同类型的电源适配器)
- 维度
- 体重
- 操作环境
- 支持的操作系统
我已尽我所能将它们规范化,但我对 接口 的实现方式感到困惑。我认为我有的选项:
将它们合二为一table
ProductUpstreamInterfaces: ProductID (primary foreign key) USB-A2 USB-A3 USB-B USB-C2 USB-C3 Thunderbolt1 Thunderbolt2 Thunderbolt3 AUX-in AUX-out HDMI . . .
和
ProductDownstreamInterfaces: ProductID (primary foreign key) USB-A2 USB-A3 USB-B USB-C2 USB-C3 Thunderbolt1 Thunderbolt2 Thunderbolt3 AUX-in AUX-out HDMI . . .
其中每个字段的值都是数量。
拆散他们
ProductInterfaces: ProductID (primary foreign key) InterfaceID (foreign key) Quantity Direction_1Up2Down (1 for up; 2 for down)
和
Interfaces: InterfaceID (primary key) Interface (eg. HDMI/DisplayPort/USB-C2/USB-C3/AUX-in/AUX-out, etc...)
选项1看起来真的很乱。
选项 2 似乎更好,但我不确定我是否会 运行 遇到任何问题......这两个哪个更好?有更好的方法吗?
除了极少数例外,只要您有许多 Y(接口)与一个 X(产品)相关,就应该将它们放在单独的 table 中。当join本身有属性时(比如你例子中的Quantity),也不会有例外。
OTOH,我不明白你为什么需要第三个 table ("Interfaces")。除了显示的字段外,它还有其他字段吗?如果没有,自定义值列表应该就足够了。
警告
请确保您没有想太多。有时,接口列表只是字段中的文本。这完全取决于您的解决方案打算实现的目标。连接 table 支持的多对多关系在您需要跟踪哪些接口在哪些产品中使用时很有用,能够快速 create/modify 产品的接口,也许生成一些统计数据(例如“80% 的类别 X 中的产品具有界面 Y”)等。否则,这只是浪费资源。