假设我有一个包含四种不同产品类型的数据库。
每种类型都包含非常不同的字段。
第一种产品分为三类。
第二种产品分为三类。
但第三种和第四种产品没有分类。
那么,建立这个数据库结构的最佳方式是什么呢? 我应该只创建四个不同的表吗? 并且,如何在这些不同的产品中构建产品交易细节结构?
那么,建立这个数据库结构的最佳方式是什么呢? 我应该只创建四个不同的表吗? 并且,如何在这些不同的产品中构建产品交易细节结构?
有多种方法可以实现这一点,但最直接的方法是:
创建一个具有共同属性的产品表:
Product
-------------
PRODUCT_ID NUMBER (PK - This is what you'll foreign key against in other tables)
PRODUCT_NAME VARCHAR(n)
PRODUCT_DESC VARCHAR(n)
PRODUCT_TYPE NUMBER (FK into PRODUCT_TYPES)
Product_Types
-------------
PRODUCT_TYPE NUMBER (PK)
DESCRIPTION VARCHAR(n)
Car_Products
-------------
PRODUCT_ID NUMBER (PK, FK - to Product)
NUM_DOORS NUMBER
NUM_CYLINDERS NUMBER
MPG NUMBER
... CUSTOM FIELDS ...
然后,您可以为不同的产品类型创建视图,以获取所需的所有信息。
Cars
-------------
CREATE VIEW Cars AS (SELECT * FROM Car_Products cp JOIN Products p ON (cp.product_id = p.product_id));
你可以用几种方法来实现这个... 最简单的方法是为每个分类都设置一个字段,并允许它们为空。这将考虑到第三和第四种物品,但可能会导致在这些列中有NULL的行(这没有问题)。
一种更难的方法是使用类似继承的结构。在这种情况下,您有一个存储所有共同属性的基本表。然后,您为每种类型的对象创建“子表”,这些子表链接到基本表并存储这些类型对象的属性。要获取完整的属性列表,您需要在视图中将父表和子表连接在一起。如果您知道要查找的对象类型,则只需链接相应的子表即可。如果您想一起查看产品,则将所有子表LEFT JOIN在一起,但这仍将导致视图中有NULL的行,您需要将其解释为此类型或那种类型。
LLBLGen 可以原生地处理这两种方法。
首先,这取决于您的类型是否相互依赖,以及您是否存储类型相关信息。
但是您肯定应该使用单个产品表。