|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
для регистрации в IoC - норм? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 20:42 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Маркерный интерфейс - антипаттерн. Если хочешь как-то пометить особым образом класс, то используй кастомные аттрибуты - они, в т.ч. для этого и придуманы. Приведи пример - как ты собираешься его использовать для IoC, я как-то не очень могу понять. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 20:59 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
public interface ICommandHandler { } public interface ICommandHandler<TCommand, TResult> : ICommandHandler where TCommand : Command { } ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 21:11 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 21:11 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach, И как это с IoC связано? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2019, 22:33 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5.
Вот такого интерфейса достаточно, не нужно городить TResult, команда не должна ничего возвращать. Если нужно получать данные (например, идентификатор созданной сущности), то это делается двумя путями: 1. хороший: через отдельное событие, на которое клиент подписывается, так как команда может выполнится асинхронно 2. средненькой паршивости: записывать данные прям в объект переданной команды. но что-то там возвращать -- совсем плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 12:49 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bach, И как это с IoC связано? Напрямую. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 12:49 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachдля регистрации в IoC - норм? здесь нет никакого маркерного интерфейса, не нужен он. рефлексия позволяет найти все реализации по дженерик-интерфейсу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 12:50 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttНапрямую. hVosttрефлексия позволяет найти все реализации по дженерик-интерфейсу. Сам сказал, сам опроверг. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 13:11 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttкоманда не должна ничего возвращать. Что за горячечный бред? Метод тоже никогда не должен ничего возвращать? Откуда тут знать, что ТС подразумевает в данном случае под "командой". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 13:14 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttНапрямую. hVosttрефлексия позволяет найти все реализации по дженерик-интерфейсу. Сам сказал, сам опроверг. тут нет маркерного интерфейса, который используется только для регистрации зависимостей. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 13:33 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttкоманда не должна ничего возвращать. Что за горячечный бред? Метод тоже никогда не должен ничего возвращать? Откуда тут знать, что ТС подразумевает в данном случае под "командой". почитай про ДДД. возврат значения из команды -- антипаттерн. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 13:33 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttCQRS точнее В исходной теме где-то было про CQRS? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 14:00 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttCQRS точнее В исходной теме где-то было про CQRS? я так понял, что речь идёт про реализацию команд хендлера из паттерна CQRS ничего другого не было сказано, так что я не понимаю с чем ты тогда споришь, да её со слюнями про "горячечный бред" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 14:09 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1. 2. 3. 4. 5.
Вот такого интерфейса достаточно, не нужно городить TResult, команда не должна ничего возвращать. Если нужно получать данные (например, идентификатор созданной сущности), то это делается двумя путями: 1. хороший: через отдельное событие, на которое клиент подписывается, так как команда может выполнится асинхронно 2. средненькой паршивости: записывать данные прям в объект переданной команды. но что-то там возвращать -- совсем плохо. не по теме сабжа вопрос: 1. а почему плохо? можешь пример привести? 2. "так как команда может выполнится асинхронно" - await? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:12 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach2. "так как команда может выполнится асинхронно" - await? Нет, как раз тут имеется в виду вовсе не await, а вызов по принципу - "отправил и забыл". И тут даже уже не то, что плохо что-то возвращать, а возвращать что-то просто не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:17 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach"так как команда может выполнится асинхронно" - await?глобально асинхронно. То есть ты не ожидаешь ответа вообще, а просто периодически проверяешь статус выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:23 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Shocker.ProТо есть ты не ожидаешь ответа вообще, а просто периодически проверяешь статус выполнения. Либо событие ловишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:25 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bach2. "так как команда может выполнится асинхронно" - await? Нет, как раз тут имеется в виду вовсе не await, а вызов по принципу - "отправил и забыл". И тут даже уже не то, что плохо что-то возвращать, а возвращать что-то просто не получится. если я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нет ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:32 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нетон имел ввиду CQRS ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:35 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
тоже читал про то, что хвост говорит про "возвращение из команды плохо". может плохо читал. если убрать требование "типа команда выполняется по принципу дернул и забыл", то чем плох реально возврат какого-то результата? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:37 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Shocker.Prolove_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нетон имел ввиду CQRS да какая разница ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:37 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нет Можно в пределах одного процесса - ничего не мешает. Отправитель - в одном потоке, обработчик - в другом. Делаешь абстракцию (интерфейс) типа ICommandBus, все команды пускаешь через неё. Если потом захочется переехать на микросервисы/распределенку, то проблем никаких - делаешь просто другую реализацию ICommandBus (через RabbitMQ, или Azure Queue Storage, например) и все - мягко, гладко и безболезненно переезжаешь. Можно при этом даже запросто распараллелить обработку команд сразу на несколько узлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:40 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachShocker.Proпропущено... он имел ввиду CQRS да какая разница в смысле фоновый сервис что с CQRS, что нет ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:40 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нет Можно в пределах одного процесса - ничего не мешает. Отправитель - в одном потоке, обработчик - в другом. Делаешь абстракцию (интерфейс) типа ICommandBus, все команды пускаешь через неё. Если потом захочется переехать на микросервисы/распределенку, то проблем никаких - делаешь просто другую реализацию ICommandBus (через RabbitMQ, или Azure Queue Storage, например) и все - мягко, гладко и безболезненно переезжаешь. Можно при этом даже запросто распараллелить обработку команд сразу на несколько узлов. оу, астанавись! я не про это сейчас - а тупо про возврат из команды ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:42 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachя не про это сейчас - а тупо про возврат из команды Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:48 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachя не про это сейчас - а тупо про возврат из команды Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем". ок, это аргумент, если есть такое требование а если нет такого требования? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:55 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachа если нет такого требования? А если нет такого требования, а потом будет? :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 18:08 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachа если нет такого требования? А если нет такого требования, а потом будет? :)) хз PS ушел в печале думать над архитектурой ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 18:18 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachушел в печале думать над архитектурой Если ты не победитель шоу "битва экстрасенсов", то забей и не пытайся предъугодать будущее. Ты предусмотришь любые изменения вдоль и поперек, а оно изменится по диагонали. Пройдено неоднократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 21:13 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Dima T, Ну, какбэ, хорошая архитектура, паттерны, SOLID и т.п. это таки совсем не только чтобы "предугадать будущее". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 21:35 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachне по теме сабжа вопрос: 1. а почему плохо? можешь пример привести? 2. "так как команда может выполнится асинхронно" - await? 1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже. 2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать. в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 23:44 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bachне по теме сабжа вопрос: 1. а почему плохо? можешь пример привести? 2. "так как команда может выполнится асинхронно" - await? 1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже. 2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать. в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. я так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2019, 16:23 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2019, 17:18 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachя так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится Нет, мотивировано не этим, это просто один из вариантов развития. Команда это не функция -- вот основное отличие. Наличие возможности возвращать результат неизбежно приводит к тому, что команды начинают применять, как функции, что вредит архитектурному принципу. Например, в команду переносят валидацию, проверки, хотя они должны быть выполнены до запуска команды. Или вычисление результата, команда не вычисляет результат, она вносит изменения в систему. Если приводить аналогию с SQL, то это как INSERT/UPDATE/DELETE -- каких вы результатов ожидаете? Единственное противоречие, которое не бьётся с командой, это идентификатор, который вычисляется на стороне БД при вставке записи в таблицу. Как решается, я писал выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2019, 00:07 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены. Этого не достаточно. Придётся сделать 2 метода у ICommandBus Придётся сделать 2 интерфейса для самой команды. Всё станет сложнее минимум в 2 раза. На самом деле более, чем в 2 раза. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2019, 00:08 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1. 2. 3. 4. 5.
Вот такого интерфейса достаточно, не нужно городить TResult, команда не должна ничего возвращать. Если нужно получать данные (например, идентификатор созданной сущности), то это делается двумя путями: 1. хороший: через отдельное событие, на которое клиент подписывается, так как команда может выполнится асинхронно 2. средненькой паршивости: записывать данные прям в объект переданной команды. но что-то там возвращать -- совсем плохо. отбросим асинхронность, меня пока это не интересует: 1. если через событие, то после вызова команды в контроллере надо сделать запрос? иначе где там ловить событие в методе, где нужно возвращаемое значение 2. "средненькую паршивость" можно как-то явно обозначить (префиксы Out к свойствам команды, ...)? или это получится "совсем плохо"? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 17:48 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
события у меня и так были, но не для "возврата из команды", а как "доменные события". как с ними связать что предложил хвост, не догнал. сделал "средненькую паршивость" - какое-то интуитивное сомнение закралось, что плохо возвращать из команд return-ом. может я просто сильно ведусь ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:42 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach, что именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:51 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:52 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttчто именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:57 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttчто именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи. тогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:03 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bach, что именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? не, ид-шник гуид, нет необходимости. честно говоря, то что ты написал, я переосмыслил. возвращать - нечего. там реально по смыслу приложения надо было делать после команды запрос. к тому же, там и так был такой запрос. в целом хвост - спасибо просто интересно - если бы ну вот сильно сильно надо было , то как? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:29 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:35 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachhVosttlove_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации вынести эту нормализацию из команды? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:40 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachlove_bachпропущено... да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации вынести эту нормализацию из команды? точно! бл*, она еще и в валидаторах, типа если могу - нормализирую. придется и это еще исправить ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:47 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttтогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари Гуид примари для кластерного индекса это не очень хорошо, потому что он не sequential и это сильно тормозит вставку. Тут разве что если генерить последовательные гуиды (в сиквеле есть готовая ф-ия, на клиенте немного сложнее, но вполне решаемо). Но, собственно, пара айдишек на деле совсем не напрягает, тем более у нас эти "внешние" guid-ы почти везде используются только для корней агрегатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:53 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Если на клиенте генерировать последовательные гуиды, тогда можно с тем же успехом генерить последовательные инты )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 19:45 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Shocker.ProЕсли на клиенте генерировать последовательные гуиды, тогда можно с тем же успехом генерить последовательные инты )) он имел ввиду не глабальные, наверное, а для этого места ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 20:04 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachпросто интересно - если бы ну вот сильно сильно надо было , то как? в идеале, подписываться на события, которые генерит команда. два варианта подписки: 1. постоянная подписка, логика отдельно, хорошо. 2. разовая подписка на изменение, тогда командам хорошо бы иметь свои ид-шники, приемлимое решение суть в том, что команда может генерировать множество событий, ещё команда может вызывать вложенные команды, а вам может понадобится только какое-то конкретное событие. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 23:49 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachlove_bachвынести эту нормализацию из команды? точно! бл*, она еще и в валидаторах, типа если могу - нормализирую. придется и это еще исправить да, отличная идея :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 23:51 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttтогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари Гуид примари для кластерного индекса это не очень хорошо, потому что он не sequential и это сильно тормозит вставку. Тут разве что если генерить последовательные гуиды (в сиквеле есть готовая ф-ия, на клиенте немного сложнее, но вполне решаемо). Но, собственно, пара айдишек на деле совсем не напрягает, тем более у нас эти "внешние" guid-ы почти везде используются только для корней агрегатов. если скорость вставки так критична, то да, норм решение не думаю, что стоит заморачиваться с генерацией последовательных гуидов ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 23:52 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttтогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари Гуид примари для кластерного индекса это не очень хорошо, потому что он не sequential и это сильно тормозит вставку. Тут разве что если генерить последовательные гуиды (в сиквеле есть готовая ф-ия, на клиенте немного сложнее, но вполне решаемо). Но, собственно, пара айдишек на деле совсем не напрягает, тем более у нас эти "внешние" guid-ы почти везде используются только для корней агрегатов. Можно делать некластерным (primary key nonclustered), проблему со скоростью вставки это вполне решает (но надо смотреть как это отразиться на скорости других запросов). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2019, 09:27 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttне думаю, что стоит заморачиваться с генерацией последовательных гуидов ) На самом деле, это очень просто, у меня где-то даже готовый код валяется для этого. МС-овский гуид (UUID версии 4) - это просто случайные биты (кроме то ли шести то ли семи фиксированных). Достаточно взять "обычный" гуид и часть старших битов заменить на таймстемп. Возможны правда сбои в порядке при одновременной генерации на разных узлах, но если их вероятностью можно пренебречь, то все должно быть ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2019, 15:28 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthat, недавно была дискуссия https://www.sql.ru/forum/1287606/vnyatno-obyasnit-pochemu-klasterizovannyy-indeks-po-guid-huzhe-int я бы всёж не заморачивался с этим до реальных замеров в конкретном кейсе. ну медленнее вставка будет, вопрос насколько? создаёт ли это проблемы с текущей пиковой нагрузкой? а если нужен шардинг, то что? ну и т.д. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2019, 19:12 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1398741]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
128ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
others: | 254ms |
total: | 515ms |
0 / 0 |