Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Подымалась тут такая темка 13029818. В которой я кое что спизд написал
Mnior
Поэтому выкиньте это всё, EAV - ошибка природы (решение для обездоленных).

Если у вас нормальный сервер, то нужен всего лишь пару готовых заранее запросов и больше ничего, никаких дополнительных таблиц.
Использование разреженных столбцов Но это не обязательно.
Тему не раскрыл, да и обещал скрипты выложить.

Ну так вот:
+ Код
USE tempdb
GO
CREATE TABLE [dbo].[Type] (
	 ID		Int		IDENTITY
	 CONSTRAINT [PK_Type]	PRIMARY KEY
	,Code		VarChar(36)	NOT NULL
	 CONSTRAINT [UQ_Type]	UNIQUE
	,Name		VarChar(512)	NOT NULL
	,Description	VarChar(4000)	    NULL
)
GO
CREATE TABLE [dbo].[Object] (
	 ID		Int		IDENTITY
	 CONSTRAINT [PK_Object]	PRIMARY KEY
	,[Type]		Int		NOT NULL
	 CONSTRAINT [FK_Object]	REFERENCES [dbo].[Type]([ID])
	,Code		VarChar(36)	NOT NULL
	,CONSTRAINT [UQ_Object]	UNIQUE (
		 [Type]
		,Code
	)
	,Name		VarChar(512)	NOT NULL
)
GO
CREATE TRIGGER [trType] ON [dbo].[Type]
--WITH EXECUTE AS OWNER
AFTER INSERT,UPDATE,DELETE AS BEGIN
	SET NOCOUNT ON;
	DECLARE	@Query	NVarChar(max) = ''

	IF Update(Code)
		SET @Query += IsNull((
		SELECT	'DROP VIEW [dbo].'
			,QuoteName('vwObject_' + D.Code)
			,';
'		FROM	Deleted D
		WHERE	NOT Exists(SELECT * FROM Inserted I WHERE I.ID = D.ID)
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'') + IsNull((
		SELECT	 CASE	WHEN D.Code != I.Code
				THEN 'EXEC sys.sp_ReName ' + QuoteName('dbo.vwObject_' + D.Code,'''') + ',' + QuoteName('vwObject_' + I.Code,'''') + ',''OBJECT'';
'				END
			,'EXEC('''
			,CASE	WHEN D.ID IS NULL
				THEN 'CREATE'
				ELSE 'ALTER'
				END
			,' VIEW [dbo].'
			,Replace(QuoteName('vwObject_' + I.Code),'''','''''')
			,' AS
SELECT	 O.ID
	,O.Type
	,T.Code	AS TypeCode
	,T.Name	AS TypeName
	,O.Code
	,O.Name',(	SELECT	'
	,O.',Replace(QuoteName(C.name),'''','''''')
			FROM	     sys.columns	C
				JOIN sys.fn_ListExtendedProperty(Default,'SCHEMA','dbo','TABLE','Object','COLUMN',Default)
							E ON E.objname	= C.name COLLATE Latin1_General_CI_AI
			WHERE	    C.object_id	= Object_ID('dbo.Object')
				AND C.is_sparse	= 1
				AND E.name	= N'Type_' + Convert(SysName,I.ID)
			FOR XML Path(''),Type),'
FROM	          dbo.Object	O
	LEFT JOIN dbo.Type	T ON T.ID = O.Type
WHERE	O.Type = ',I.ID AS [*],'
'')
'		FROM	          Inserted	I
			LEFT JOIN Deleted	D ON D.ID   = I.ID
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')

	BEGIN TRY
		EXEC (@Query)
	--	PRINT @Query
	END TRY BEGIN CATCH
		IF (@@TranCount > 0)
		AND(XAct_State()> 0)
			ROLLBACK
		SET @Query	+= '
Msg ' + Convert(VarChar,Error_Number()) + ', Level ' + Convert(VarChar,Error_Severity()) + ', State ' + Convert(VarChar,Error_State()) + IsNull(', Procedure ' + Error_Procedure(),'') + ', Line ' + Convert(VarChar,Error_Line()) + '
' + Error_Message()
		RAISERROR('%s',18,1,@Query)
		RETURN
	END CATCH
END
GO
CREATE VIEW [dbo].[vwObjectColumn] AS
SELECT	 C.column_id			AS ID
	,C.name				AS Name
	,Convert(NVarChar(4000),D.value)AS Description
	,C.user_type_id			AS Type
	,X.Type				AS TypeName
	,X.Type
	+ CASE	WHEN C.user_type_id	IN (106,108)			THEN '(' + Convert(VarChar,C.precision) + ',' + Convert(VarChar,C.scale) + ')'
		WHEN C.user_type_id	IN (41,42,43)			THEN '(' + Convert(VarChar,C.scale) + ')'
		WHEN C.user_type_id	IN (165,167,173,175,231,239)	THEN '(' + IsNull(Convert(VarChar,X.Length),'max') + ')'
		ELSE ''	END		AS TypeDescription
	,X.Length
	,X.Scale
	,CASE	WHEN Exists(
		SELECT	*
		FROM	sys.index_columns	I
		WHERE	    I.object_id = C.object_id
			AND I.column_id = C.column_id
			AND NOT Exists(
				SELECT	*
				FROM	sys.index_columns O
				WHERE	    O.object_id  = I.object_id
					AND O. index_id  = I. index_id
					AND O.column_id != I.column_id))
		THEN Convert(Bit,1)
		ELSE Convert(Bit,0)
		END			AS Indexed
FROM	          sys.columns	C
	LEFT JOIN sys.types	T ON T.user_type_id	 = C.user_type_id
	LEFT JOIN sys.fn_ListExtendedProperty('MS_Description','SCHEMA','dbo','TABLE','Object','COLUMN',Default)
				D ON D.objname = C.name COLLATE Latin1_General_CI_AI
	OUTER APPLY (SELECT	
		 CASE	WHEN T.[schema_id] != Schema_ID('sys')		THEN QuoteName(Schema_Name(T.[schema_id])) + '.' + QuoteName(T.name)
									ELSE T.name		END
		,CASE	WHEN C.max_length = -1				THEN NULL
			WHEN C.user_type_id	IN (165,167,173,175)	THEN C.max_length
			WHEN C.user_type_id	IN (231,239)		THEN C.max_length/2
			WHEN C.user_type_id	IN (106,108)		THEN C.precision	END
		,CASE	WHEN C.user_type_id	IN (106,108,41,42,43)	THEN C.scale		END
			)	X (Type,Length,Scale)
WHERE	    C.object_id	= Object_ID('dbo.Object')
	AND C.is_sparse	= 1
GO
CREATE TRIGGER [trObjectColumn] ON [dbo].[vwObjectColumn]
--WITH EXECUTE AS OWNER
INSTEAD OF INSERT,UPDATE,DELETE AS BEGIN
	SET NOCOUNT ON;
	DECLARE	 @Query	NVarChar(max) = ''
		,@Index	NVarChar(max) = ''

	IF Update(ID)
	AND Exists(SELECT * FROM Deleted)
	BEGIN
		ROLLBACK
		RAISERROR('Колонка ID недоступна для редактирования',18,1)
		RETURN
	END

	IF Update(Name)
	OR Update(TypeName)
	OR Update(Length)
	OR Update(Scale)
	OR Update(Indexed)
		SET @Query += IsNull((
		SELECT	'DROP INDEX ',QuoteName('IX_SPARSE_' + D.Name),' ON [dbo].[Object];
'		FROM	          Deleted	D
			LEFT JOIN Inserted	I ON I.ID = D.ID
		WHERE	D.Indexed = 1 AND
			Exists(SELECT D.Name, D.TypeName, D.Length, D.Scale, D.Indexed
			EXCEPT SELECT I.Name, I.TypeName, I.Length, I.Scale, I.Indexed)
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')
	IF Update(Name)
		SET @Query += IsNull((
		SELECT	'EXEC sys.sp_ReName ',QuoteName('dbo.Object.' + D.Name,''''),',',QuoteName(I.Name,''''),',''COLUMN'';
'		FROM	     Inserted	I
			JOIN Deleted	D ON D.ID   = I.ID
		WHERE	D.Name != I.Name
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')
	IF Update(TypeName)
	OR Update(Length)
	OR Update(Scale)
		SET @Query += IsNull((
		SELECT	'ALTER TABLE [dbo].[Object] DROP ',QuoteName(D.Name),';
'		FROM	Deleted D
		WHERE	NOT Exists(SELECT * FROM Inserted I WHERE I.ID = D.ID)
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'') + IsNull((
		SELECT	'ALTER TABLE [dbo].[Object] '
			,CASE	WHEN D.ID IS NULL
				THEN 'ADD  '
				ELSE 'ALTER COLUMN '
				END
			,QuoteName(I.Name), ' '
			,CASE	WHEN T.[schema_id] != Schema_ID('sys')
				THEN QuoteName(Schema_Name(T.[schema_id])) + '.'
				END
			,IsNull(QuoteName(T.name),'<InvalidType>')
			,CASE	WHEN T.user_type_id	IN (106,108)			THEN '(' + Convert(VarChar,IsNull(I.Length,T.precision)) + ',' + Convert(VarChar,IsNull(I.Scale,T.scale)) + ')'
				WHEN T.user_type_id	IN (41,42,43)			THEN '(' + Convert(VarChar,I.Scale) + ')'
				WHEN T.user_type_id	IN (165,167,173,175,231,239)	THEN '(' + IsNull(Convert(VarChar,I.Length),'max') + ')'
				END
			,' SPARSE;
'		FROM	          Inserted	I
			LEFT JOIN Deleted	D ON D.ID = I.ID
			LEFT JOIN sys.types	T ON T.name = ParseName(IsNull(I.TypeName,D.TypeName),1)
						 AND T.schema_id = Schema_ID(IsNull(ParseName(IsNull(I.TypeName,D.TypeName),2),'sys'))
		WHERE	Exists(SELECT I.TypeName, I.Length, I.Scale
			EXCEPT SELECT D.TypeName, D.Length, D.Scale)
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')
	IF Update(Description)
		SET @Query += IsNull((
		SELECT	 'EXEC sys.sp_'
			,CASE	WHEN I.Description != D.Description	THEN 'update'
				WHEN I.Description IS NOT NULL		THEN 'add'
				WHEN D.Description IS NOT NULL		THEN 'drop'
				END
			,'extendedproperty ''MS_Description'''
			,',' + QuoteName(I.Description,'''')
			,',''SCHEMA'',''dbo'',''TABLE'',''Object'',''COLUMN'','
			,QuoteName(I.Name,''''),'
'		FROM	          Inserted	I
			LEFT JOIN Deleted	D ON D.ID = I.ID
		WHERE	   I.Description IS NOT NULL
			OR D.Description IS NOT NULL
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')
	IF Update(Name)
	OR Update(TypeName)
	OR Update(Length)
	OR Update(Scale)
	OR Update(Indexed)
		SET @Index += IsNull((
		SELECT	'CREATE INDEX ',QuoteName('IX_SPARSE_' + I.Name),' ON [dbo].[Object] (',QuoteName(I.Name),') WHERE (',QuoteName(I.Name),' IS NOT NULL);
'		FROM	          Inserted	I
			LEFT JOIN Deleted	D ON D.ID = I.ID
		WHERE	I.Indexed = 1 AND
			Exists(SELECT I.Name, I.TypeName, I.Length, I.Scale, I.Indexed
			EXCEPT SELECT D.Name, D.TypeName, D.Length, D.Scale, D.Indexed)
		FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')


	BEGIN TRY
		EXEC (@Query)
		EXEC (@Index)
	--	PRINT @Query
	--	PRINT @Index
	END TRY BEGIN CATCH
		IF (@@TranCount > 0)
		AND(XAct_State()> 0)
			ROLLBACK
		SET @Query	+= '
Msg ' + Convert(VarChar,Error_Number()) + ', Level ' + Convert(VarChar,Error_Severity()) + ', State ' + Convert(VarChar,Error_State()) + IsNull(', Procedure ' + Error_Procedure(),'') + ', Line ' + Convert(VarChar,Error_Line()) + '
' + Error_Message()
		RAISERROR('%s',18,1,@Query)
		RETURN
	END CATCH
END
GO
CREATE VIEW [dbo].[vwTypeColumn] AS
SELECT	 T.ID				AS Type
	,T.Code				AS TypeCode
	,T.Name				AS TypeName
	,C.column_id			AS [Column]
	,C.name				AS ColumnName
FROM	           dbo.Type	T
	CROSS JOIN sys.columns	C
	      JOIN sys.fn_ListExtendedProperty(Default,'SCHEMA','dbo','TABLE','Object','COLUMN',Default)
				E ON E.objname	= C.name COLLATE Latin1_General_CI_AI
				 AND E.name	= N'Type_' + Convert(SysName,T.ID)
				 AND E.value	= Convert(SQL_Variant,T.ID)
WHERE	    C.object_id	= Object_ID('dbo.Object')
	AND C.is_sparse	= 1
GO
CREATE TRIGGER [trTypeColumn] ON [dbo].[vwTypeColumn]
--WITH EXECUTE AS OWNER
INSTEAD OF INSERT,DELETE AS BEGIN
	SET NOCOUNT ON;
	DECLARE	@Query	NVarChar(max) = ''

	IF Exists(SELECT * FROM	Inserted I
	WHERE NOT Exists(SELECT * FROM
		dbo.Type	T CROSS JOIN
		sys.columns	C
		WHERE	   T.Code	= I.TypeCode
			AND C.object_id	= Object_ID('dbo.Object')
			AND C.is_sparse	= 1
			AND C.name	= I.ColumnName
	)) BEGIN
		ROLLBACK
		RAISERROR('Колонка или тип не найдены',18,1)
		RETURN
	END

	SET @Query += IsNull((
	SELECT	 'EXEC sys.sp_',V.Operation AS [*],'extendedproperty '
		,QuoteName('Type_' + Convert(SysName,T.ID),'''')
		,',NULL,''SCHEMA'',''dbo'',''TABLE'',''Object'',''COLUMN'','
		,QuoteName(V.[Column],''''),'
'	FROM	(		SELECT 'drop',TypeCode,ColumnName FROM Deleted	D
		UNION ALL	SELECT 'add' ,TypeCode,ColumnName FROM Inserted	I) V(Operation,Type,[Column])
		JOIN dbo.Type	T ON T.Code = V.Type
	FOR XML Path(''),Type).value('text()[1]','NVarChar(max)'),'')
	
	BEGIN TRY
		EXEC (@Query)
	--	PRINT @Query
	END TRY BEGIN CATCH
		IF (@@TranCount > 0)
		AND(XAct_State()> 0)
			ROLLBACK
		SET @Query	+= '
Msg ' + Convert(VarChar,Error_Number()) + ', Level ' + Convert(VarChar,Error_Severity()) + ', State ' + Convert(VarChar,Error_State()) + IsNull(', Procedure ' + Error_Procedure(),'') + ', Line ' + Convert(VarChar,Error_Line()) + '
' + Error_Message()
		RAISERROR('%s',18,1,@Query)
		RETURN
	END CATCH

	UPDATE	T
	SET	Code = Code
	FROM	(	SELECT TypeCode FROM Inserted
		UNION	SELECT TypeCode FROM Deleted ) E
		JOIN dbo.Type	T ON T.Code = E.TypeCode
END
GO -----------------------------------------------------------------------------
INSERT dbo.Type (Code,Name) VALUES ('Type1','Type first')
INSERT dbo.Object (Type,Code,Name) VALUES (Scope_Identity(),'Obj1','Object one')
INSERT dbo.Type (Code,Name) VALUES ('Type2','Type second')
INSERT dbo.Object (Type,Code,Name) VALUES (Scope_Identity(),'Obj2','Object two')
INSERT dbo.vwObjectColumn (Name,TypeName,Length,Description,Indexed) VALUES
	 ('Test1','Int',NULL,'Test first',1)
	,('Test2','VarChar',50,NULL,0)
UPDATE	dbo.vwObjectColumn
SET	 Name		+= '_Upd'
	,TypeName	= 'VarChar'
	,Length		= 20
	,Indexed	= 1
INSERT	dbo.vwTypeColumn (TypeCode,ColumnName) VALUES
	 ('Type1','Test1_Upd')
	,('Type2','Test1_Upd')
	,('Type2','Test2_Upd')

SELECT *,IndexProperty(Object_ID('dbo.Object'),'IX_SPARSE_' + Name,'IndexID') AS IndexID
         FROM dbo.vwObjectColumn
SELECT * FROM dbo.Object
SELECT * FROM dbo.vwObject_Type1
SELECT * FROM dbo.vwObject_Type2
GO -----------------------------------------------------------------------------
DROP VIEW dbo.vwObject_Type2
DROP VIEW dbo.vwObject_Type1
DROP VIEW dbo.vwTypeColumn
DROP VIEW dbo.vwObjectColumn
DROP TABLE dbo.Object
DROP TABLE dbo.Type
GO
Тестовый код в конце.

Многовато конечно, но:
1. Поддержка изменений
2. Поддержка индексов
3. Показано как можно свои свойства колонок нафигачить
4. Создаются (и обновляются) отдельные VIEW для каждого типа объекта
Если чё, можно тот или иной кусок просто выбросить.

Ну так вот, примерно так я вижу понимание расширенных свойств объекта в крайнем случае. Не стоит злоупотреблять "универсальностью".

Код "поддержки изменений" должен в итоге выпиливаться, или точнее нужно ещё одно свойство - Simple, флаг ручное/автоматическое управление как для типа, так возможно и для колонок. Т.к. вероятно будет навешиваться код на некоторые типы объектов, которое в итоге сначала перенесётся в отдельную дополнительную расширительную таблу, а затем вообще из Entity системы.
30 авг 12, 20:50    [13091638]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior,

1. Слишком много динамики;
2. Не вижу "реальной картины мира" - наследования типов объектов (классов).

ЗЫ. Ох, зря я это на ночь глядя... :)
30 авг 12, 21:03    [13091673]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Ну...

ООП на сервере
Создание сервера приложений
Ставка на ВЕРО
30 авг 12, 21:16    [13091686]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin, какой нафиг ООП. Туды его в качель.

Я просто критикую, что вместо впихивания EAV куда не попадя, на таблице вида:
CREATE TABLE [dbo].[ObjectProperty] (
	 [Property]	Int
	,[Object]	Int
	,CONSTRAINT [PK_ObjectProperty] PRIMARY KEY (
		 [Property]
		,[Object]
	)
	,[Value]	Sql_Variant
)
Уж лучше вослользовались SPARSE.
A чтобы не было аргумента "нельзя динамически поддерживать", то вот и привёл код.

Но это не значит что я за впихивание EAV на SPARSE колонках. Я против EAV вообще.
Не должно быть в базе никаких универсальностей, ибо это только кажется, что расширительные свойства нужно давить через EAV. Завтра обязательно появится "Сделай отчёт, когда свойство ...", "Нужно поставить условие на свойство ...", "нужно ..."
Не, физическая схема базы должна быть близка логической схеме системы.
30 авг 12, 21:29    [13091717]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior,

автор
Я просто критикую, что вместо впихивания EAV куда не попадя, на таблице вида ... Уж лучше вослользовались SPARSE.


Ну, а я как бы тебя поддерживаю, и привел линки на работающие решения.

автор
Не должно быть в базе никаких универсальностей, ибо это только кажется, что расширительные свойства нужно давить через EAV.


А тут позволю себе с тобой не согласиться. Первый линк объяснит, почему.

автор
Не, физическая схема базы должна быть близка логической схеме системы.


Не всегда унаследованная сущность предметного мира должна мапиться в "свою таблицу". Она может легко "умещаться" в таблицу "родителя", но иметь свои поведенческие характеристики.
30 авг 12, 21:48    [13091752]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
Mnior
Не, физическая схема базы должна быть близка логической схеме системы.
Не всегда унаследованная сущность предметного мира должна мапиться в "свою таблицу". Она может легко "умещаться" в таблицу "родителя", но иметь свои поведенческие характеристики.
В том то и дело, что это уже не EAV и как раз довольно близко к логической структуре. Это только апологеты NOT NULL будут с тобой спорить.
30 авг 12, 21:58    [13091770]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Дайошь дырявую войну!!!!111

убежал за попкорном
30 авг 12, 21:58    [13091773]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior
Это только апологеты NOT NULL будут с тобой спорить.


Не совсем понял... Я лучше сделаю связь 1-к-1, чем разрешу NULLовое поле в схеме. Я апологет?
30 авг 12, 22:08    [13091788]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
pkarklin
Mnior
Это только апологеты NOT NULL будут с тобой спорить.


Не совсем понял... Я лучше сделаю связь 1-к-1, чем разрешу NULLовое поле в схеме. Я апологет?

ээээ.... а почему?
30 авг 12, 22:08    [13091789]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
locky
ээээ.... а почему?


ну чтоб потом не было (грубо):

...
WHERE
  ISNULL(Doc.CloseDate, '21000101') < GETDATE())
30 авг 12, 22:13    [13091801]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
автор
Не должно быть в базе никаких универсальностей, ибо это только кажется, что расширительные свойства нужно давить через EAV.
А тут позволю себе с тобой не согласиться. Первый линк объяснит, почему.
Там простыня, уж извини но это перечитывать нет смысла, и там явно много мнений и притом противоречивых, так что сразу опишите суть.

Сразу скажу, чтобы небыло недоразумений, я поддерживаю несколько вариантов описанного. Разве что не в извразщённой крайней ООП форме. Всётаки логических слоёв больше чем одно. Оно эфемерно размазано.
Так вот, мне эти Entity за#$ли. Оно конечно работает, в тягучем болоте тоже можно жить. Но динамика системы совсем не та (она обязана легко изменятся).

Возвращаесь к теме - в чём там "универсальность"? Что вы подумали под этим словом?
Может мы говорим на разных языках.
30 авг 12, 22:14    [13091803]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
Я лучше сделаю связь 1-к-1, чем разрешу NULLовое поле в схеме. Я апологет?
Всё равно не понял причём тут связь. Но вы не апологёт уже по вышесказнному: колонки "наследника" у "родителя".
Апологёты это скорее аффтары Третьего манифеста (NULL-ов нет в любой форме).
30 авг 12, 22:20    [13091829]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
pkarklin
locky
ээээ.... а почему?


ну чтоб потом не было (грубо):

...
WHERE
  ISNULL(Doc.CloseDate, '21000101') < GETDATE())

А, в этом смысле!
Ну тут согласен, хотя я обычно считаю что 21000101 - это типа "неустановленный конец периода"


зы хотя вот в навижне ваще нету наллов.... такой гемор.....
30 авг 12, 22:32    [13091875]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior,

автор
Там простыня, уж извини но это перечитывать нет смысла, и там явно много мнений и притом противоречивых, так что сразу опишите суть.


Там действительно много постов. Но по этим постам хорошо видно, как откровенное неприятие перетекает в понимание. Собственно, что пришлось пройти и мне.

автор
Так вот, мне эти Entity за#$ли.


Entityтями надо распоряжаться с умом, IMHO.

автор
Возвращаесь к теме - в чём там "универсальность"? Что вы подумали под этим словом?


Доказать универсальность EVA мне пытались несколько лет назад на одной из встреч сообщества SQL.RU ровно в том месте, где сейчас находится мой офис. Это же мне пытался рассказать один из сегодняшних собеседуемых (аминь...)...

автор
Может мы говорим на разных языках.


Отнюдь, я полностью на Вашей стороне.
30 авг 12, 22:37    [13091898]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
locky
Ну тут согласен, хотя я обычно считаю что 21000101 - это типа "неустановленный конец периода"


Ага. Только для РСУБД будет гораздо "проще" сделать (грубо):

...
FROM
  dbo.Document D
...
WHERE
  NOT EXISTS(SELECT * FROM dbo.DocCloseDate WHERE ID = D.ID AND CloseDate < GETDATE() )
30 авг 12, 22:43    [13091930]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Так вот. Все эти Entity c "Универсальными" табличками экономия на спичках.
Не, можно конечно иметь, но приемуществ на приктике не на столько много сколько кажется, а недостатков достаточно.
В моём примере да и вообще dbo.Object это просто шаблонное имя, и скорее применится на какой-то частности.

В большей части прогеры хомяги, даже Randome у них выигрывает по выбору правильных решений.

Этот SPARSE (EAV) совсем не затронул реальной темы Entity. Я хочу освятить тёмную сторону, случай системы несвязанных объектов, не на втиснении в общие таблы, а динамического создания реальных табл для каждого типа.
Т.е. не Pascal (от одного Object), а С++ (без единого Object).

Условно говоря это что-то типа тулзы быстрого разворачивания и поддержки простых типов.
Выше указанный код (SPARSE EAV) это тоже что-то типа тулзы, а не ядро.
Т.е. убив эту тулзу полностью система останется работоспособной, в отличие от "стандартного" подхода, где оно постоянно нагружает систему со своими лимонами связок.

Почему? Потому что "стандартный" подход усугубляет проблему неправильного выбора, а не решает её. Язык обязан подстёгивать прогерра, но не мешать.

PS: Обычно я пишу для людей которые в теме. Но если вы не понимаете что занчит "плохие/неправильные решения при использовании Entity" и т.п. то спрашивайте.
30 авг 12, 22:48    [13091953]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
pkarklin
locky
Ну тут согласен, хотя я обычно считаю что 21000101 - это типа "неустановленный конец периода"


Ага. Только для РСУБД будет гораздо "проще" сделать (грубо):

...
FROM
  dbo.Document D
...
WHERE
  NOT EXISTS(SELECT * FROM dbo.DocCloseDate WHERE ID = D.ID AND CloseDate < GETDATE() )


дащаз!!!!! (спорить не буду - просто согласись со мной)
30 авг 12, 22:49    [13091956]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
locky
дащаз!!!!!


Цитирую...

pkarklin
Я лучше сделаю связь 1-к-1
30 авг 12, 22:53    [13091968]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
pkarklin
locky
дащаз!!!!!


Цитирую...

pkarklin
Я лучше сделаю связь 1-к-1


Пойду ка я за тапком.....
Нефиг больше делать, как нагружать сервер ненужным джойном
30 авг 12, 22:57    [13091987]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Mnior,

автор
(без единого Object)


Боюсь, при таком подходе нам с Вами не попути...

автор
тулзы быстрого разворачивания и поддержки простых типов.


Я не работаю с простыми типами. Типы - они у меня отражения объектов реального мира.

автор
где оно постоянно нагружает систему со своими лимонами связок.

Портянку Вы не стали читать... Там нет EVA и, соответственно, нет лимонов связок.

автор
Обычно я пишу для людей которые в теме.


ЗдОрово! А то как то скушно стало на ГФ. Наконец-то нашелся тот, кто в тем...

автор
то спрашивайте


О чём???
30 авг 12, 23:00    [13092005]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
locky
Нефиг больше делать, как нагружать сервер ненужным джойном


Ты где то увидел в приведенном мной скрипте джоин? ;)

ЗЫ. Уж с чем, а с джоином скуль справляется на "Ура". Спорить не буду - просто согласись со мной...
30 авг 12, 23:03    [13092016]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
pkarklin
locky
Нефиг больше делать, как нагружать сервер ненужным джойном


Ты где то увидел в приведенном мной скрипте джоин? ;)

ЗЫ. Уж с чем, а с джоином скуль справляется на "Ура". Спорить не буду - просто согласись со мной...

Вот не надо меня на фа-фа ловить!
уж лефт-анти-семи-джойн (или как он там?) я слава богу увидеть могу!

А уж подход "да чо там, подумаешь, еще один джойн!" - а потом приходится проектор покупать, чтобы план запроса на стене рассматривать, 3 на 6 метров!
30 авг 12, 23:05    [13092022]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin
NOT EXISTS(SELECT * FROM dbo.DocCloseDate WHERE ID = D.ID AND CloseDate < GETDATE() )
Вот он защитник "третьего манифеста".
Разче что связки писать не надо, да и вааще там синтаксис совершенно другой (см. Tutorial D explained).
30 авг 12, 23:08    [13092036]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
locky
А уж подход "да чо там, подумаешь, еще один джойн!" - а потом приходится проектор покупать, чтобы план запроса на стене рассматривать, 3 на 6 метров!


Не злись... Я ведь не теоретизирую и ты об этом прекрасно знаешь...
30 авг 12, 23:08    [13092039]     Ответить | Цитировать Сообщить модератору
 Re: EAV зло  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pkarklin это форум, обращаюсь я не лично у вам. Естественно что многое вами должно попускаться.

pkarklin
Mnior
(без единого Object)
Боюсь, при таком подходе нам с Вами не попути...
Это почему?
pkarklin
Я не работаю с простыми типами. Типы - они у меня отражения объектов реального мира.
Эстэственно.
О том и речь. Что если тебе хочеца иниверсальности, и даже справочники лень развормачивать, тоды уж лучше тулза чем Entity.
Но во вторых есть общие механизмы и похожие свойства у данных разных объектов. То что они имеют свои таблицы расширений это естественная и не интересная часть. Вопрос то "об универсальности/общности".
Так вот, в Entuty пахают Property, Reference, Деревья, и всё для общего Object.
pkarklin
Там нет EVA и, соответственно, нет лимонов связок.
Я не про то, не путайте.
И не надо заострять вопрос только на вашей ссылке.
30 авг 12, 23:25    [13092109]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить