何时拆分到另一个数据库表

时间:2019-10-26 15:39:07

标签: database database-design

我的问题是关于数据库以及何时拆分为其他表。我正在为多个平台制作库存跟踪器。例如,我有一个Item资源,我将连接到具有Item的不同平台,例如Foo和Bar。有共享的属性,例如名称,数量,sku,条形码,但是平台具有特定于它们的不同属性。他们将拥有自己的唯一ID,Foo可能具有标签,而Bar可能没有,但是具有供应商标签。现在我所做的是这样的:

Item
- id
- name
- sku
- barcode
... bunch of others
- foo_id
- foo_tags
- foo_product_type

但是,如果我与Bar平台集成,是否应该向Itembar_idbar_vendor之类的bar_other_properties资源添加字段?还是应该将其创建为另一个表,并且Item将具有该表的外键?什么时候应该将这些平台特定的属性拆分到另一个表中?在性能方面,额外的连接是否会使速度变慢?例如,如果我要为用户更新所有这些项目,那么我将加入UserShopItem,现在可能是PlatformSpecificItemData,而我不知道是否有太多的表要连接并影响性能。

1 个答案:

答案 0 :(得分:0)

说实话,这有时可能很难。我经常使用数据库,但是它们很少真正庞大,不是像行那么大,而是像字段一样大。通常不超过5张桌子。

但是,根据我的经验,您可以分解更多的表,以后扩展数据库并进行编辑或维护就越容易。这看起来似乎很愚蠢,但可以想象一下,如果所有这些都放在一个表中,它将使其非常易于使用,但是现在,如果您将标签更改为其他内容,其中您拥有2个字段而不是1个字段,依此类推。或者,如果您的系统仍需要旧版本的标签,但新系统不使用它,您现在不能只是删除它们,该怎么办?拆分它可以为您提供更大的灵活性。

我建议所需的信息在主表中,其余信息分开。如果您经验不足,这可能会使查询速度变慢,并且难以创建适当的查询,但是从长远来看,当您进行更改时,这样做是值得的。

items
    - id
    - name
    - sku
    - barcode
items_physical_properties
    - id
    - items_id
    - width
    - height
    - weight
    - quantity
    - color
items_digital_properties
    - id
    - items_id
    - tags
    - image
items_information
    - id
    - items_id
    - manufacturer
    - manufactured_date
    - vendor
    - company
    - created_date
items_pricing
    - id
    - items_id
    - sell_price
    - cost_price
items_sales
    - id
    - items_id
    - sale_price
    - start_date
    - end_date
    - amount_sold

我会把它分解成这样,原因是,假设您创建了一个第三方api或idk收银机,这使得限制您给他们的东西变得容易得多。这也使限制查询内容变得更加容易,下面以收银机为例。他们不需要知道Manufacturer_date,但是也许一个在幕后的家伙使用手持扫描仪就知道了。

// my mysql is a bit rusty, but here is an example

// cash register
SELECT 
    items.id, items.name, 
    items_prices.sell_price,
    items_sales.sale_price
FROM items
JOIN items_prices ON items.id=items_prices.items_id
JOIN items_sales ON items.id=items_sales.items_id

手动扫描仪的家伙需要不同的信息,而还有其他控制此信息的方法,一些数据库使您可以控制它购买访问它们的用户。与第三方合作,或者仅是个人混合和匹配查询时,它都变得更加容易。

您甚至可以进行更深入的了解,但是有一点可以为您所收获的东西创造更多的工作。不确定是否有帮助,但这是我使用数据库的经验