Не делай этого.
Если вы абсолютно уверены, что все заметки относятся к одному и тому же абстрактному типу данных, даже если они могут принадлежать / использоваться разными типами данных, создайте подтипы заметок для каждого типа владельца / пользователя.
Это делает четыре вещи: он позволяет вам использовать аварийный люк, если крип требования предъявляет, например, заметки клиентов оказываются не такими, как заметки о перспективах, удерживает вас (или Entity Framework ORM) от необходимости писать некрасивый SQL, позволяет вам использовать обычные ограничения ссылочной целостности в базе данных и позволяет использовать достойные ограничения типов в .Net.
В основном:
В базе данных:
create table note (
id int synthetic key of some sort,
notetext text
);
create table customer_note(
id int synthetic key of some sort,
customer_id int not null references customer(id),
note_id not null references note(id)
-- add requirement creep customer note attribute data here
);
В .net:
void Customer :: addNote (CustomerNote & note) {
// ввод текста предотвращает случайное добавление заметки потенциальному клиенту
...
}
(Здесь есть только одна «проблема»: когда Prospect превратится в Customer, у вас будет преобразователь, который преобразует это изменение, что в конечном итоге приведет к удалению строк из таблицы prospect_note и вставке их в customer_note. ORM сделает это неэффективный способ, каскадное удаление, но вы сможете переопределить это и сделать это эффективно, если вам нужно, написав сохраненный процесс или тому подобное.)