Вариант А
Мы работаем над небольшим проектом, который требует мастера ценообразования для пользовательских таблиц. (Да, настоящие пользовательские столы - те, за которыми вы едите. Отсюда я буду называть их кухонными столами, чтобы мы не путались) Я придумал модель, в которой каждая часть кухонного стола была таблицей базы данных. Итак, база данных выглядела так:
TableLineItem
-------------
ID
TableSizeID
TableEdgeWoodID
TableBaseID
Quantity
TableEdgeWoodID
---------------
ID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours
Каждая часть должна иметь возможность рассчитать свою цену. Большинство расчетов очень похожи. Мне понравилась эта структура, потому что я могу перетащить ее прямо в конструктор linq-to-sql и сгенерировать все мои классы. (Меньше написания кода означает меньше обслуживания ...) Затем я реализую интерфейс вычисления стоимости, который просто принимает размер таблицы. Я написал несколько тестов, и это хорошо работает. Я также добавил таблицу для фильтрации деталей в пользовательском интерфейсе на основе предыдущих выборов. (Вы не можете иметь конкретную древесину с определенной отделкой.) В модели есть еще одно исключение, и у меня они жестко закодированы. Эта модель очень жесткая, и изменение требований приведет к изменению модели данных. (Например, если на всех столах вдруг понадобятся зонтики.)
Вариант B:
После различных встреч с моими коллегами (что, вероятно, занимало больше времени, чем следовало бы, учитывая размер этого проекта), мои коллеги решили, что они предпочтут более общий подход. Примерно так:
Spec
----
SpecID
SpecTypeID
TableType_LookupID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours
SpecType
--------
SpecTypeID
ParentSpecType_SpecTypeID
IsCustomerOption
IsRequiredCustomerOption
и т.д ...
Это гораздо более общий подход, который можно использовать для создания любого продукта. (например, если бы они начали продавать стулья ...) Я думаю, что это займет больше времени, но будет более гибким в будущем. (хотя я сомневаюсь, что мы еще вернемся к этому.) Кроме того, вы потеряете некоторую ссылочную целостность - вам понадобятся триггеры для обеспечения того, чтобы основание таблицы не могло быть установлено для дерева таблиц.
Вопросы:
- Какую структуру базы данных вы предпочитаете? Не стесняйтесь предлагать свои собственные.
- Что можно считать лучшей практикой? Если у вас есть несколько похожих таблиц базы данных, вы создаете 1 таблицу базы данных со столбцом типа или несколько отдельных таблиц? Я подозреваю, что ответ начинается с "Это зависит ..."
- Какова будет предполагаемая разница во времени в двух подходах (1 неделя, 1 день, 150% больше и т. Д.)
Заранее спасибо. Дайте мне знать, если у вас есть какие-либо вопросы, чтобы я мог обновить это.