我正在设计一个管理车队的数据库(MySQL)。
该公司在全市有许多车库,在每个车库,车辆都得到了维修(运营)。一个操作可以是3种服务类型中的任何一种。
工作台车辆,工作台Garagae,工作台操作,工作台操作类型1,工作台操作类型2,工作台操作类型3。
每个操作都有车辆ID和车库ID,但是如何根据用户选择的服务类型将其链接到其他表(服务表)?
我还想添加一个计费表,但我不知道如何设计这些表之间的关系。
发布于 2015-04-09 22:35:43
如果我完全理解它,我会建议这样做(首先,你不应该有三个操作表):
Vehicles Table
- id
- garage_id
Garages Table
- id
Operations/Services Table
- id
- vehicle_id
- garage_id
- type
Customer Table
- id
- service_id
billings Table
- id
- customer_id发布于 2015-04-09 22:42:15
您需要六个表:
vechicle: id, ...
garage: id, ...
operation: id, vechicle_id, garage_id, operation_type (which can be
one of the tree options/operations available, with the possibility to be extended)
customer: id, ...
billing: id, customer_id, total_amount
billingoperation: id, billing_id, operation_id, item_amount您绝对不应该为操作创建三个表。将来,如果您想引入一个新的操作,这将涉及到在数据库中创建一个新的表。
发布于 2015-04-09 23:00:43
郑重声明,我不同意每个人说你不应该有多个操作表。我认为这是非常好的,只要它是正确的。事实上,我现在正在用我的一款产品做到这一点。
如果我理解的话,在你问题的核心,你问的是如何做表继承,因为Op Type 1和Op Type 2(等)是一次行动。简短的答案是你不能,更长的答案是你不能……至少不能没有一些辅助逻辑。
我假设您有某种程序可以从数据库中提取数据,而不仅仅是手动编写sql命令。在这个假设下,让我们使用它作为数据库的一个子集:
Garage
------
GarageId | GarageLocation | etc.
---------|----------------|------
1 | 123 Main St. | XX
Operation
---------
OperationId | GarageId | TimeStarted | TimeEnded | OperationTypeDescId | OperationTypeId
------------|----------|-------------|-----------|---------------------|----------------
2 | 1 | noon | NULL | 2 | 2
OperationTypeDesc
-------------
OperationTypeDescId | Name | Description
--------------------|-------|-------------------------
1 | OpFoo | Do things with the stuff
2 | OpBar | Do stuff with the things
OpFoo
-----
OpID | Thing1 | Thing2
-----|--------|-------
1 | 123 | abc
OpBar
-----
OpID | Stuff1 | Stuff2
-----|--------|-------
1 | 456 | def
2 | 789 | ghi使用此设置,您可以获得以下信息:
相同
现在我们可以开始了解继承在哪里起作用了。在操作表中,OperationTypeId引用相关table...the的OpId“相关表”由OperationTypeDescId确定。
举个例子:假设我们有上面的数据集。在这个示例中,我们知道在主街123号的一个车库中发生了一个操作。我们知道它从中午开始,到现在还没有结束。我们知道操作的类型是"OpBar“。因为我们知道我们正在做的是OpBar操作而不是OpFoo操作,所以我们可以只关注与OpBar相关的属性,即stuff1和stuff2。因为运维的OperationTypeId是2,所以我们知道Stuff1是789,Stuff2是ghi。
现在是棘手的部分。在您的程序中,这将需要Reflection。如果您不知道这是什么,那就是从该类型的名称中获取Type的做法。在我们的示例中,由于OperationTypeDesc表中的名称,我们知道要查看哪个表(OpBar)。换句话说,您不会自动知道要查找哪个表;反射会告诉您该信息。
编辑: Csaba说“如果你想在未来引入一个新的操作,这将涉及到在数据库中创建一个新的表”。这是正确的。您还需要向OperationTypeDesc表中添加一个新行。Csaba暗示这是一件坏事,我不同意-有几个条款。如果你打算频繁地添加一个新的操作类型,那么是的,他提出了一个非常好的观点。您不希望不断地创建新的表。但是,如果您提前知道将执行哪些类型的操作,并且很少添加新类型的操作,那么我认为这是可行的方法。所有操作共有的所有信息都会出现在Operation表中,而所有特定于op的信息会出现在相关的“子表”中。
关于这一点还有一个非常重要的注意事项。由于这是如何设计的,你,人类,必须意识到设计。无论何时创建新的操作类型,它都不像创建新表那么简单。具体地说,您必须确保新表名和OperationTypeDesc " name“条目相同。可以把它看作是一个额外的约束--一个“整型”列只能包含int,否则db将不允许数据。同样," name“列只能包含现有表的名称。作为人类,你必须意识到这个约束,因为它不能(很容易)自动强制执行。
https://stackoverflow.com/questions/29541235
复制相似问题